C ++中的纯ABC是否需要虚拟的?

时间:2018-08-09 13:08:09

标签: c++

假设一个可怕的死亡钻石中的多个路径都可以继承纯抽象基类。使用虚拟继承是否有充分的理由,或者没关系吗?

1 个答案:

答案 0 :(得分:2)

使用虚拟继承是一个很好的理由,因为编译器会强制执行它。考虑这种情况:

struct A {
  virtual ~A() = default;
  virtual void f() = 0;
};

struct B : A {};

struct C : A {};

struct D : B, C {
   void f() override {}
};

没有虚拟继承,以下代码将无法编译

D d;
A &a = d; // error: 'A' is an ambiguous base of 'D'

当您如此更改BC

struct B : virtual A {};

struct C : virtual A {};

一切都会好起来的。