1、相同基类继承的二义性
多个子类同时继承与同一个基类后,其派生类在访问基类成员时,会出现二义性问题,因为派生类无法选择继承路径。解决办法,通过使用虚拟继承可以解决这类二义性问题。
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; class A { public: int a; }; class B:public virtual A //A是B的虚基类 { public: int b; }; class C:public virtual A //A是C的虚基类 { public: int c; }; class D:public B,public C { public: int d; }; int main() { D d; d.a = 100; //通过虚基类继承,不会出现两义性问题 return 0; }
2、不同基类继承的二义性
子类继承多个父类,并且这个多个父类具有相同命名的成员(只要名称相同,不区分函数参数或者成员类型);当子类调用父类相同命名成员时,会出现二义性问题,因为派生类不能区分调用哪个父类的成员。解决办法,通过使用指定父类名称可以解决这类二义性问题。
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; class A{ public: int a; void dispaly(){}; }; class B{ public: int b; void dispaly(){}; }; class C:public A,public B { public: int b; void show(){}; }; int main() { C c; c.b; //不会出现两义性,调用是C中的b c.B::b; //调用B中的b // c.dispaly(); //两义性问题出现 c.A::dispaly(); //通过指定基类A来调用函数display c.B::dispaly(); return 0; }
3、画图形象说明基类A , B、C继承于A ,D继承于B、C
两义性问题的产生:
虚基类消除两义性