cpp 多重继承意外构造函数调用

cpp multiple inheritance unexpected ctor called

为什么 Down 不通过 LeftRight 两次调用 Base 构造函数?

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
}

因为您使用的是基类 class:

的虚拟继承
class Left : virtual public Base {
class Right : virtual public Base {

如果您想调用它两次,请删除 virtual 关键字:

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

如果您想避免 'diamond problem',本文可能对您有用: http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

为什么要这样做?从字面上看,它不是 虚拟继承的全部要点,您已选择在您的代码示例中使用它。我猜你决定使用它而不研究它的作用。

至于这种行为是 "incorrect",好吧,根据定义,这是你的期望是不正确的。