cpp 多重继承意外构造函数调用
cpp multiple inheritance unexpected ctor called
为什么 Down
不通过 Left
和 Right
两次调用 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",好吧,根据定义,这是你的期望是不正确的。
为什么 Down
不通过 Left
和 Right
两次调用 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",好吧,根据定义,这是你的期望是不正确的。