如果已经声明了类A1,A2,再让B继承A1,A2,A1,A2中有名字相同的成员,如果都被B继承下去了,则在B中就有重复的成员,这时候就产生了二义性。
class A1 class A2
{ {
public: public:
int a; int a;
void m(); void m();
}; };
class b:public A1,public B;
{
int a;
void m();
int a;
void m();
};
则在创建对象的时候就会出现二义性;
B b;
b.a=2; //此时就会报错;
b.m();//错
//加上作用域就好了;
b.A1::a=2;// 错
b.A1::m(); //对
b.A1::a=2;
b.A2::a=3;
共同基类产生的二义性:
B继承A ,C又继承B,然后C间接的继承了A,则A中的成员在C中会出现两次,则出现二义性。
伪代码:
class B1:public A{.......};
class B2:public A{........};
class C:public B1,public B2;
class A
{
int a;
void m();
}
class B1 :public A class B2:public:A
{ {
public: public:
int a; int a;
void m(); void m();
}; };
class C:public B1,public B2
{
int a;
void m();
int a;
void m();
};
解决办法:在B继承A的时候加上virtual,这样叫虚基继承。
class B1:virtual publicA{-------};
class B2:virtual public B{----------};
class C:public B1,public B2;