c++ - 姐妹类代表团

标签 c++ virtual-functions

我正在经历这个:- https://isocpp.org/wiki/faq/multiple-inheritance#mi-delegate-to-sister

有人能给我解释一下这是怎么发生的以及为什么会发生吗?

最佳答案

其他两个答案中缺少的关键是存在虚拟继承。这意味着在完整的对象中只有一个 Base 子对象,由Der1Der2 共享。

Der1Der2 类型中的每一个都提供了该基的虚函数之一的实现,并且由于只有一个这样的对象,因此组合Der1Der2 在完整对象中提供了两个成员的实现。

您可以分派(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/

相关文章:

c++ - std::shared_ptr 的原始指针返回基而不是派生

c++ - 是否可以在 OS X 上重新设置 QProgressBar 的样式?

c++ - 通过 Qt C++ 中的键访问解析的嵌套 JSON

c++ - 为什么我们需要 C++ 中的虚函数?

c++ - 为什么编译器在可能的情况下不使虚函数成为非虚函数?

c++ - ASCII 艺术 - C/C++ 中的固定边框

c++ - C++中exit和kill的区别

c# - 这个代码块的输出对我来说没有意义

c++ - (C++ 继承)在 STL 容器中存储具有共同父对象的对象

c++ - 虚拟模板方法有意义吗?