c++ - C++,diamond继承,什么是纯virtuals需要实现的地方?

  显示原文与译文双语对照的内容

C++: 具有纯虚拟 function f()的基类,然后两个类和C 继承自B 和C ( 典型的菱形结构) 继承的类D:


 A f() = 0


 v/v


 B C


 /


 D



在以下情况下,f() = 0需要在什么地方实现?

  • ( B 和C 都有纯虚函数( -> 做抽象类必须实现继承纯)?
  • 其中只有一个( B 异或) 拥有纯虚函数( 。-> 另一个仍在执行中,必须执行该操作( 必须执行) ))?
  • B 和C 都没有自己的( 。-> 在B 和C 中跳过实现的可能方法"的纯virtuals通过"到D?
  • 在上述三种情况中,哪种情况下需要实现 f()? 在哪种情况下,f() 可以实现? 在这种情况下,如果有的话,f() 实现是不可能的?

对于这些问题还有其他常见的建议?

谢谢。

时间: 原作者:

B 和C 都有纯虚函数( -> 做抽象类必须实现继承的纯 virtuals?

是。从抽象类继承的任何类必须实现virtual实现虚函数才能实例化。 否则他们也会是抽象的。

其中只有一个( B 异或) 拥有纯虚函数( -> 另一个仍然必须实现f ( ))?

由于 C 还从 A 派生,它还应该实现 f()

B 和C 都没有自己的( 。-> 在B 和C 中跳过implmentation的可能方法"的纯virtuals通过"到D?

可以这样做,但是这样可以防止 B 或者 C的实例化就像-


A *obj = new B();//Error


A *obj = new C();//Error



在上述三种情况中,哪种情况下需要实现 f()? 在哪种情况下,可以选择implment到 f()? 在这种情况下,如果有的话,D implment f()?

只要你想要所有的父类都是抽象的,f() 就可以单独在 D 中实现。

原作者:
...