假设一个可怕的死亡钻石中的多个路径都可以继承纯抽象基类。使用虚拟继承是否有充分的理由,或者没关系吗?
答案 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'
当您如此更改B
和C
struct B : virtual A {};
struct C : virtual A {};
一切都会好起来的。