我想知道什么是“ 虚拟基类 ”以及它的含义。
让我举个例子:
class Foo { public: void DoSomething() { /* ... */ } }; class Bar : public virtual Foo { public: void DoSpecific() { /* ... */ } };
虚拟继承中使用的虚拟基类是一种在使用多重继承时防止给定类的多个“实例”出现在继承层次结构中的方法。
考虑以下场景:
class A { public: void Foo() {} }; class B : public A {}; class C : public A {}; class D : public B, public C {};
上面的类层次结构导致“可怕的钻石”看起来像这样:
A / \ B C \ / D
D 的一个实例将由包含 A 的 B 和也包含 A 的 C 组成。所以你有两个 A 的“实例”(为了更好的表达)。
当您遇到这种情况时,您可能会产生歧义。当你这样做时会发生什么:
D d; d.Foo(); // is this B's Foo() or C's Foo() ??
虚拟继承就是为了解决这个问题。当您在继承类时指定 virtual 时,您是在告诉编译器您只需要一个实例。
class A { public: void Foo() {} }; class B : public virtual A {}; class C : public virtual A {}; class D : public B, public C {};
这意味着层次结构中只包含一个 A 的“实例”。因此
D d; d.Foo(); // no longer ambiguous
这是一个小总结。有关更多信息,请阅读this和this。这里也有一个很好的例子。