[菜鸟求助]有关虚基类和多重继承中构造函数的调用

陌上花花 2010-09-04 03:00:17

#include <iostream.h>
class Base
{
public:
Base()
{
cout<<"class Base"<<endl;
}
};

class D1:virtual public Base
{
public:
D1()
{
cout<<"class D1"<<endl;
}
};

class D2:virtual public Base
{
public:
D2()
{
cout<<"class D2"<<endl;
}
};

class D3:public Base
{
public:
D3()
{
cout<<"class D3"<<endl;
}
};

class D4:public D1,public D2,public D3
{
public:
D4()
{
cout<<"Class D4"<<endl;
}
};

void main(void)
{
D4 d;
}


其中代码的执行结果为:

class Base......(1)
class D1
class D2
class Base......(3)
class D3
class D4

问题是知道构造函数是先调用基类后调用子类的,但是为何有(3)处的class Base输出,它和(1)处的区别在哪里?
这其中存在哪些问题?请帮忙看下
...全文
199 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-09-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 super0208 的回复:]
引用 1 楼 pengzhixi 的回复:

(1)处的是作为虚基类的调用 (3)处是因为继承D3,而D3继承了Base的调用

但是有个问题:C++中规定基类的构造函数和析构函数都不能被派生类继承的。
这个就不大理解了..
[/Quote]

派生类可以自动调用,如果需要传参那么可以用初始化列表
onebluemorning 2010-09-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 super0208 的回复:]
引用 1 楼 pengzhixi 的回复:

(1)处的是作为虚基类的调用 (3)处是因为继承D3,而D3继承了Base的调用

但是有个问题:C++中规定基类的构造函数和析构函数都不能被派生类继承的。
这个就不大理解了..
[/Quote]
不是 继承 基类的构造函数 而是 调用 基类的构造函数
D1 D2都是虚继承Base 因而只调用一次Base的构造函数
而D3不是虚继承 因而再一次调用基类也就是Base的构造函数

陌上花花 2010-09-05
  • 打赏
  • 举报
回复
感谢大家了。谢谢
cswuyg 2010-09-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 super0208 的回复:]
但是有个问题:C++中规定基类的构造函数和析构函数都不能被派生类继承的。
这个就不大理解了..
[/Quote]
他想说的应该是:D3子对象被构造的时候,会先构造D3的基类子对象。
陌上花花 2010-09-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

(1)处的是作为虚基类的调用 (3)处是因为继承D3,而D3继承了Base的调用
[/Quote]
但是有个问题:C++中规定基类的构造函数和析构函数都不能被派生类继承的。
这个就不大理解了..
lovemeizh 2010-09-04
  • 打赏
  • 举报
回复
可以从两条线来看。
第一条线是:D1 D2都是虚继承Base,这样Base作为虚基类它的构造函数只会有一份保存在D4中。也就是(1)的输出。
第二条线是:D3是公共继承Base,这样在调用D3时会首先调用Base的构造函数,这样这条线仍会从Base开始调用,所以就会有(3)的输出。
cswuyg 2010-09-04
  • 打赏
  • 举报
回复
你认为应该是什么输出呢?原因,就像1楼说的那样。。
另外,这样的继承不好。
虚拟继承的目的就是为了避免二义性,D3也应该虚拟继承。不然,D4就不应该继承D3。
pengzhixi 2010-09-04
  • 打赏
  • 举报
回复
(1)处的是作为虚基类的调用 (3)处是因为继承D3,而D3继承了Base的调用

65,184

社区成员

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

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