关于虚继承时派生类调用构造函数问题

whdugh 2013-10-17 08:57:51
#include <iostream>

using namespace std;
class cbasebase
{
public:
cbasebase() {cout << "cbasebase()" << endl;}
cbasebase(const string&) {cout << "cbasebase(const string &)" << endl;}
virtual ~cbasebase() {cout << "~cbasebase()" << endl;}
};
class cbase1: virtual public cbasebase
{
public:
cbase1(const string& s): cbasebase(s) {cout << "cbase1(const string&)" << endl;}
virtual ~cbase1() {cout << "~cbase1()" << endl;}
};
class cbase2: virtual public cbasebase
{
public:
cbase2(const string& s): cbasebase(s) {cout << "cbase2(const string&)" << endl;}
virtual ~cbase2() {cout << "~cbase2()" << endl;}
};
class cbase3
{
public:
cbase3() {cout << "cbase3()" << endl;}
virtual ~cbase3() {cout << "~cbase3()" << endl;}
};
class cderived: public cbase1, public cbase2, public cbase3
{
public:
cderived(const string& s): cbase1(s), cbase2(s) {cout << "cderived(const string&)" << endl;}
virtual ~cderived() {cout << "~cderived()" << endl;}
};

int main()
{
cderived a(string("hello world")); ///cbasebase<> 为何虚继承会调用无参构造函数?
///cbase1<const string&>
///cbase2<const string&>
///cbase3<>
///cderived<const string&>
///~cderived<>
///~cbase3<>
///~cbase2<>
///~cbase1<>
///~cbasebase<>

return 0;
}

在虚继承时,派生类构造对象时,为什么会调用基类中的无参构造函数啊?
...全文
138 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
上例中cbase1, cbase2,的构造函数并不会被调用。 请看《inside C++ model》中文版第210页,有详细介绍
  • 打赏
  • 举报
回复
继承是虚继承,就有如下的继承结构了: cbasebase / \ / \ cbase1 cbase2 cbase3 \ / / \ / / cderived 那么在cderived对象中,只有一个cbasebase子对象。在构造cderived对象时, cbasebase的构造函数也最先执行,与cbase1,cbase2的构造函数中对cbasebase的构造函数的调用无关,因为这是在构造cderived对象。 如果想不调用cbasebase的默认构造函数,可改为: class cderived: public cbase1, public cbase2, public cbase3 { public: cderived(const string& s): cbase1(s), cbase2(s),cbasebase(s)
zhaokai115 2013-10-17
  • 打赏
  • 举报
回复
嘿嘿,上面说错了。应该是一个diamond问题。derived的结构应该包含下面几方面内容: base // base1和base2共同的部分 base1 // base1多出来的部分 base2 // base2多出来的部分 base3 所以要对它们一一初始化
zhaokai115 2013-10-17
  • 打赏
  • 举报
回复
因为derived间接派生自base,调用无参base()是构造derived自己吧。
Universe_Admin 2013-10-17
  • 打赏
  • 举报
回复
确认下源代码是否一致

64,662

社区成员

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

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