我们知道类具有三大特性:封装、继承和多态。继承,可以在现有类的功能上进一步扩展,而无需在构建新的类。但有时多重继承会使结构变得复杂,不注意的话还会引起二义性。其中比较典型的一个案例:
class A
{ public: int a; };
class B: public A
{};
class C: public A
{};
class D: public B, public C
{};
那么此时如果我们声明一个D类的对象:
int main()
{
D d;
d.a = 0; //错误,无法区分是从B还是C继承来的a
d.B::a = 0; //正确
d.C::a = 0; //正确
}
因此,很容易出现混淆和错误。然而如果我们设定类A为虚基类,则就不用再去区分是从哪条路径继承来的a值了。即:
class A
{ public: int a; };
class B: virtual public A // A是B的虚基类
{};
class C: virtual public A // A是C的虚基类
{};
class D: public B, public C
{};
此时就可以直接调用 d.a= 0;了。
C++提供虚基类的方法,使得在继承间接共同基类是只保留一份成员。(C++程序设计)