萌新想请教一下c++的虚继承构造顺序的问题

wzxxxx123 2021-01-08 12:27:28
#include<iostream>
using namespace std;
class A {
public:
A() {
cout << "A Done!\n";
}
};
class E :public A {
public:
E()
{
cout << "E Done!\n";
}
};
class B : virtual public A {
public:
B() {
cout << "B Done!\n";
}
};
class C :virtual public A {
public:
C() {
cout << "C Done!\n";
}
};
class D : public E,public B, public C {
public:
D()
{
cout << "D Done!\n";
}
};

int main() {
D d;
return 0;
}
这是代码

这是执行结果
请问为什么构造顺序是什么?小白刚学有点不懂为什么会先构造两次A
...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
我不让风停 2021-06-29
  • 打赏
  • 举报
回复

我推测是这样的,构造d时检测到d的父类由虚继承类,因此把基类A先拿出来构造(这样如果A的子类都是虚继承的话就会只构建自己就行了),所以A,接着构建E,E并非是虚继承,在构建时是先创建父类对象再构建子类对象因此是AE,BC是虚继承,只构建自己就好了,因此是BC,最后构建D,则A AE BC D

maguangzhi 2021-01-10
  • 打赏
  • 举报
回复
参见《C++程序设计精要教程》,很清楚的分4个优先级。
wzxxxx123 2021-01-09
  • 打赏
  • 举报
回复
引用 1 楼 真相重于对错的回复:
E不是虚拟继承,所以它要调用一次A构造函数,BC虚拟继承,俩个调用1次
我觉得应该是aeabcd这样的顺序 不知道为什么是aaebcd
真相重于对错 2021-01-09
  • 打赏
  • 举报
回复
c++对于基类的构造函数调用次序没有明确规定,只要求按深度层次顺序调用 也就是说b继承于a,那么a的构造函数一定在b构造函数之前调用
真相重于对错 2021-01-08
  • 打赏
  • 举报
回复
E不是虚拟继承,所以它要调用一次A构造函数,BC虚拟继承,俩个调用1次

64,654

社区成员

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

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