cpp多重继承意外的ctor叫

时间:2015-03-21 16:56:24

标签: c++ constructor multiple-inheritance

Down为什么不通过Base&amp;调用Left来调用Right ctor class Base { public: Base() { cout << "base-ctor" << endl; } Base(string a) { cout << a << endl; } }; class Left : virtual public Base { public: Left(string a) : Base(a) {} }; class Right : virtual public Base { public: Right(string a) : Base(a) {} }; class Down : public Left, public Right { public: Down(string a) : Left(a), Right(a) {} }; int main() { Down x("down"); // -> base-ctor } 两次?

{{1}}

2 个答案:

答案 0 :(得分:1)

因为您正在使用基类的虚拟继承:

class Left : virtual public Base {
class Right : virtual public Base {

如果您想要将其调用两次,请删除虚拟关键字:

class Left : public Base {
class Right : public Base {

如果您想避免钻石问题,本文可能对您有用&#39;: http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

答案 1 :(得分:0)

为什么要这样?它实际上不是虚拟继承的全部要点,您已经选择在代码示例中使用它。我猜你决定在不研究它的作用的情况下使用它。

至于这种行为是&#34;不正确&#34;,根据定义,你的期望是不正确的。