C++ 默认构造函数和虚拟继承

C++ 默认构造函数和虚拟继承,c++,C++,是否可以为未提供默认构造函数的类进行虚拟继承 目前的菱形图(最简单的一个,只是没有提供默认构造函数的更改)没有编译(g++4.4.3) 谢谢, Francesco我相信您的类D也需要在其初始值设定项列表中显式调用A的构造函数。您需要在此处显式调用A的构造函数 D(int i) : A(i), B(i), C(i) {} 虚拟基类的特殊之处在于,它们由最派生的类初始化,而不是由从虚拟基类继承的任何中间基类初始化。哪种可能的多个初始值设定项是初始化一个基的正确选择 如果正在构造的最派生类没有将其

是否可以为未提供默认构造函数的类进行虚拟继承

目前的菱形图(最简单的一个,只是没有提供默认构造函数的更改)没有编译(g++4.4.3)

谢谢,
Francesco

我相信您的类
D
也需要在其初始值设定项列表中显式调用
A
的构造函数。

您需要在此处显式调用
A
的构造函数

 D(int i) : A(i), B(i), C(i) {}
虚拟基类的特殊之处在于,它们由最派生的类初始化,而不是由从虚拟基类继承的任何中间基类初始化。哪种可能的多个初始值设定项是初始化一个基的正确选择

如果正在构造的最派生类没有将其列在其成员初始化列表中,则虚拟基类将使用其默认构造函数进行初始化,该构造函数必须存在并且可以访问


无耻地抄袭自:-)

多布斯博士的文章解释了处理这一问题的各种方法。建议基本上提供默认构造函数和
init()
方法。它为B和C增加了更多的工作,但避免了D必须了解A。

您需要像这样解释调用A的构造:

D(int i) : A(i), B(i), C(i) {}

当然,让D不知道A是可取的。不幸的是,“init()”解决方案有一个缺点:a的构造函数将被调用两次(B和C各调用一次),这可能会产生副作用(特别是在使用静态成员的情况下)。此外,如果开发人员创建
类D:public a{}
,则可能根本不会调用'init()'方法,从而使对象处于未初始化状态。
D(int i) : A(i), B(i), C(i) {}