【问题标题】:Virtual Inheritance虚拟继承
【发布时间】:2013-08-24 06:54:30
【问题描述】:

为了解决菱形问题,我们使用虚拟继承。

class A {}
class B : virtual Public A {}
class C : virtual Public A {}
class D : public B, Public C {}

为什么没有这样定义:

class A {}
class B : public A {}
class C : public A {}
class D : virtual public B, virtual public C {}

在 C++ 中解决钻石问题的现有解决方案背后的技术原因是什么,而不是第二个。 改变基类的继承来解决派生类中的一些问题是不是很尴尬。

如果有人能提供复杂的技术,那就太好了。 谢谢。

【问题讨论】:

    标签: inheritance virtual


    【解决方案1】:

    已经回答here:-

    您想要:(可通过虚拟继承实现)

       D
      / \
     B   C
      \ /
       A
    

    而不是:(没有虚拟继承会发生什么)

        D
       / \
      B   C
      |   |
      A   A
    

    【讨论】:

    • 我知道。我的问题更多关于语法。为什么我们不能有第二种语法?背后的原因是什么?
    • C++ 默认情况下分别遵循每个继承路径,因此 D 对象实际上将包含两个单独的 A 对象,并且 A 的成员的使用必须正确限定。
    • 如果从 A 到 B 的继承和从 A 到 C 的继承都标记为“virtual”(例如,“class B : virtual public A”),C++ 特别注意只创建一个 A对象,并且 A 的成员的使用正常工作。如果虚拟继承和非虚拟继承混合使用,则 A.C++ 的每个非虚拟继承路径都有一个虚拟 A 和一个非虚拟 A。C++ 需要明确说明从哪个父类调用要使用的功能。
    猜你喜欢
    • 2016-10-26
    • 2016-03-26
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多