一个关于构造函数的问题?

dizhen 2003-11-12 11:34:12
#include<iostream.h>
class b0
{
public:
b0(int n){nv=n;}
int nv;
void fun(){cout<<"member of b0"<<endl;}

};
class b1 :virtual public b0
{
public:
b1(int a):b0(a){}
int nv1;
};
class b2 :virtual public b0
{
public:
b2(int a):b0(a){}
int nv2;
};
class D1: public b1,public b2
{
public:
D1(int a):b0(a),b1(a),b2(a){}
int vd;
void fun(){cout<<"member of d1"<<endl;}
};
void main()
{
D1 d1;
d1.nv=2;
d1.fun();
}
该程序提示说 'D1' : no appropriate default constructor available
什么意思呀帮帮忙。

...全文
90 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jp311 2003-11-12
  • 打赏
  • 举报
回复
void main()
{
D1 d1(2);
}
如果你定义了构造函数,编译器就不会为你再生成默认构造了
Nemo1314 2003-11-12
  • 打赏
  • 举报
回复
#include<iostream.h>
class b0
{
public:
b0(int n){nv=n;}
int nv;
void fun(){cout<<"member of b0"<<endl;}

};
class b1 :virtual public b0
{
public:
b1(int a):b0(a){}
int nv1;
};
class b2 :virtual public b0
{
public:
b2(int a):b0(a){}
int nv2;
};
class D1: public b1,public b2
{
public:
D1(int a):b0(a),b1(a),b2(a){}
int vd;
void fun(){cout<<"member of d1"<<endl;}
};
void main()
{
D1 d1(2);
cout<<d1.nv;
d1.fun();
}
liem 2003-11-12
  • 打赏
  • 举报
回复
你的D1是从b1与b2继承过来的,其构造函数不能调用b0的构造函数
D1(int a):b0(a),b1(a),b2(a){}
改成
D1(int a):b1(a),b2(a){}
gosirius 2003-11-12
  • 打赏
  • 举报
回复
没有参数的构造函数称为默认构造函数

如果你的类提供了一个构造函数, 就必需提供一个显示声明的默认构造函数.
即使这个函数什么也不作.
在类声明中加上
b0() {}

bluedodo 2003-11-12
  • 打赏
  • 举报
回复
因为你多重继承b1,b2,D1的constructor不知道倒底用哪一个的构造函数
direstrait 2003-11-12
  • 打赏
  • 举报
回复
前面都非常正确,只是你写这种构造函数的时候一般注意一点,给它一个默认参数,比如:
class D1: public b1,public b2
{
public:
D1(int a = 0):b0(a),b1(a),b2(a){}
int vd;
void fun(){cout<<"member of d1"<<endl;}
};
在D1(int a =0 ),当你用D1定义一个变量的时候,如果没有给出初始参数,它就会使用默认参数.前面几个都一样.至于有人说D1里面不调用b0()是不对的,当然,如果b0有默认构造函数的话,编译器会自动调用,可是你这里没有,所以一定要显式的调用.因为,当一个派生类有直接或间接的虚基类的时候,需要最后一个派生类使虚基类构造其子类.(这里这个词不好表达,有些书上叫"最派生类",这个例子里面是D1.
psbeond 2003-11-12
  • 打赏
  • 举报
回复
或者定义对像的时候直接调用你写的构造函数,不要只是
D1 d1;
computer386 2003-11-12
  • 打赏
  • 举报
回复
大家在自己的机器上做过了吗????
zhouqingyuan 2003-11-12
  • 打赏
  • 举报
回复
D1 d1;这一句要调用缺省构造函数,而你的类中已经有了自定义构造函数,则不生成缺省构造函数,于是就会出错了。
AnnyBJ 2003-11-12
  • 打赏
  • 举报
回复
9494,在类声明中加上
b0() {}

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧