#include<iostream.h>
class A
{
public:
void fn(){cout<<"A:fn()"<<endl; }
};
class B1: virtual public A // 虚拟继承
{
public:
void fn(){cout<<"B1:fn()"<<endl; }
};
class B2: virtual public A // 虚拟继承
{
public:
void fn(){cout<<"B2:fn()"<<endl; }
};
class C1:public B1
{
};
class C2:public B2
{
};
class D:public C1,public C2
{
};
void main()
{
D obj;
obj.C1::fn();
obj.C2::fn();
obj.A::fn(); //可以执行,无二义性
}
执行结果:
注意使用方式:obj.A::fn();
若类A不是虚基类语句obj.A::fn()就不能执行,这是因为计算机无法确定是执行B1继承的基类A的函数,还是执行B2继承的基类A的函数,具有二义性。A为虚基类就只有一个基类副本,obj.A::fn()没有二义性。
转自:C++ 程序设计(第2版)-李龙澍-清华大学出版社-7.4 虚基类 P148
【百度网盘 下载链接】C++ 程序设计(第2版)-李龙澍-清华大学出版社