【问题标题】:Virtual Base Class in C++C++ 中的虚拟基类
【发布时间】:2013-04-08 06:56:07
【问题描述】:

我有一个关于虚拟基类的问题。为了解决多重继承中的“死亡之钻”/歧义问题,引入了虚基类。

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};

class C 声明中未使用关键字virtual 时会发生什么。能详细解释一下吗?

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};

【问题讨论】:

  • 旁注:使用组合而不是继承(使用基于组件的设计模式)
  • “死亡之钻”是 C++ 多重继承中的问题,而不是多重继承中的问题。

标签: c++ multiple-inheritance virtual-inheritance diamond-problem


【解决方案1】:

如果您的继承不是virtual,那么A 成员将在D 类中出现两次。

如果A 有一个名为_a 的字段,那么在D 中写入B::_aC::_a 将引用两个不同的内存区域。如果你的继承是virtual,那么你只有一个内存区。

【讨论】:

    【解决方案2】:

    如果您使用的是virtual,那么当您使用Class D 的实例调用foo() 时不会有歧义。如果您不使用虚拟,那将是模棱两可的.. 但要小心虚拟继承成本更高,所以小心使用它..

    【讨论】:

      【解决方案3】:
      class A { public: void Foo() {} };
      class B : public virtual A {};
      class C : public A {};
      class D : public B, public C {};
      

      如果从A类到B的继承标记为virtual但不是A类到C,那么C++将创建一个单独的虚拟A(D继承B,B继承A)和一个非虚拟A(D继承C,C继承A) )。因此,您的代码不会解决菱形问题:

      D d_object;
      A &a_ref = d_object; // error raised -> B::A or C::A
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 2011-04-02
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        相关资源
        最近更新 更多