我正在经历这个:- https://isocpp.org/wiki/faq/multiple-inheritance#mi-delegate-to-sister
有人能给我解释一下这是怎么发生的以及为什么会发生吗?
最佳答案
其他两个答案中缺少的关键是存在虚拟继承。这意味着在完整的对象中只有一个 Base
子对象,由Der1
和Der2
共享。
Der1
和 Der2
类型中的每一个都提供了该基的虚函数之一的实现,并且由于只有一个这样的对象,因此组合Der1
和 Der2
在完整对象中提供了两个成员的实现。
您可以分派(dispatch)给兄弟类,因为您实际上是在调用您的 Base
类型的成员函数,并且该函数是在您的 Base
子对象中实现的(通过你的兄弟类)。请注意,Der1
不会调用 Der2::bar
,而是调用 Base::bar
,然后将其分派(dispatch)给恰好是在 Der2
中。这与在其他情况下分派(dispatch)到最终覆盖程序确实没有什么不同:
struct base { virtual void f() = 0; };
struct d : base { void g() { f(); } };
struct d1 : d { void f() { std::cout << "here"; };
int main() {
d1 x;
x.g(); // dispatches from 'd::g' to 'd1::f' which is below in the hierarchy!
// yeah, right, everyone knows that... no magic here
}
现在,如果继承不是虚拟的,完整类型中将有两个 Base
子对象,每个子对象都有一个(不同的)纯虚函数,您甚至无法实例化最派生类型的对象(除非它提供了虚函数的定义)
关于c++ - 姐妹类代表团,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280329/