C++关于继承问题,跪求高手解答

2024-12-16 00:28:38
推荐回答(4个)
回答1:

错误的根源在于CLIEN没有默认的构造函数。
crect(int a,int b,int c,int d,int e,int f):l1(a,b,c,d),l2(c,d,e,f)这样的赋值方式是错误的。要实现这样的赋值方式,必须保证基类有默认的构造函数
你在cline中能这么用,是因为CPOINT类有一个默认的构造函数。
cpoint(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
如果改为
cpoint(int x,int y)
{
this->x=x;
this->y=y;
}
同样会报错。

回答2:

class cline:public cpoint
{
private:
cpoint p1,p2;
public:
cline(){}
cline(int a,int b,int c,int d)
:p1(a,b),p2(c,d)
{}
没有可用的默认构造函数,导致出错

回答3:

为Cline定义一个带有默认参数的构造函数即可,完整源代码如下,vc6.0测试通过。
#include
#include
using namespace std;
class cpoint
{
public:
int x,y;
public:
cpoint(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
};
class cline:public cpoint
{
private:
cpoint p1,p2;
public:
cline(int a = 0,int b = 0,int c = 0,int d = 0)
:p1(a,b),p2(c,d)
{}
double length()//求两点间距
{
return sqrt((p2.y-p1.y)*(p2.y-p1.y)+(p2.x-p1.x)*(p2.x-p1.x));
}
};
class crect:public cline
{
private:
cline l1,l2;
public:
crect(int a,int b,int c,int d,int e,int f)
:
l1(a,b,c,d),l2(c,d,e,f)
{}
void girth()
{
cout<<"周长:"<<2*(l1.length()+l2.length()) < }
void area()
{
cout<<"面积:"< }
};
int main()
{
crect c(0,0,1,0,1,1);
c.girth();
c.area();
return 0;
}

回答4:

在cline类中,cpoint p1,p2需要调用cpoint的默认构造函数cpoint(),而你在cpoint中定义了自己的构造函数导致该默认构造函数失效,所以你需要在cpoint中补上该默认构造函数,而crect中cline同理也是。