11.4.2 共同基类和虚继承
第10章中介绍过,对非虚基派生方式,无法用汇聚处的派生类对象为共同基类的对象或指针赋值,即无法使用共同基类的指针指向汇聚处的派生类对象,也无法发挥出多态的威力,采用虚基派生的方式只保留基类的一个副本,这时可以用汇聚处的派生类对象为共同基类的对象或指针赋值。图11.2对应的类定义如下所示。
图 11.2 虚基派生
<———————————————-文件名:ABCDdef.h——————————————> #include<iostream> using namespace std; class A//公共基类 { public: virtual void a()//虚函数 { cout<<"a()in A"<<endl; } virtual void b()//虚函数 { cout<<"b()in A"<<endl; } virtual void c()//虚函数 { cout<<"c()in A"<<endl; } virtual void d()//虚函数 { cout<<"d()in A"<<endl; } }; class B:virtual public A//虚基派生类B { public: void a()//虚函数 { cout<<"a()in B"<<endl; } void b()//虚函数 { cout<<"b()in B"<<endl; } }; class C:virtual public A//虚基派生类C { public: void a()//虚函数 { cout<<"a()in C"<<endl; } void b()//虚函数 { cout<<"b()in C"<<endl; } void c()//虚函数 { cout<<"c()in C"<<end1; } }; class D:public B,public C//多基派生 { public: void a()//虚函数 { cout<<"a()in D"<<endl; } void d()//虚函数 { cout<<"d()in D"<<endl; } };在上述类定义下,编写代码如下所示。 A*pA=new D; pA->a();//输出:a()in D,在D中进行了定义 pA->b();//错误,二义性 pA->c();//输出:c()in A,从基类A中继承而来 pA->d();//输出:d()in D,在D中进行了定义,与pA->a();类似
此时,上述代码中对b函数的调用会产生二义性,因为b函数没有在类D中重定义,那么在类D中继承而来的b函数是来自类B还是类C呢?编译器无法判断。