同样地,类C中成员函数调用f()也会出现二义性问题。例如:
viod C::h()
{
f();
}
这里有二义性问题,该函数应修改为:
void C::h()
{
A::f();
}
或者
void C::h()
{
B::f();
}
或者
void C::f()
{
A::f();
B::f();
}
另外,在前例中,类B中有一个成员函数g(),类C中也有一个成员函数g()。这时,
c1.g();
不存在二义性,它是指C::g(),而不是指B::g()。因为这两个g()函数,一个出现在基类B,一个出现在派生类C,规定派生类的成员将支配基类中的同名成员。因此,上例中类C中的g()支配类B中的g(),不存在二义性,可选择支配者的那个名字。
当一个派生类从多个基类派生类,而这些基类又有一个共同的基类,则对该基类中说明的成员进行访问时,也可能会出现二义性。例如:
class A
{
public:
int a;
};
class B1 : public A
{
private:
int b1;
};
class B2 : public A
{
private:
int b2;
};
class C : public B1, public B2
{
public:
int f();
private:
int c;
};
已知:C c1;
下面的两个访问都有二义性:
c1.a;
c1.A::a;
而下面的两个访问是正确的:
c1.B1::a;
c1.B2::a;
类C的成员函数f()用如下定义可以消除二义性:
int C::f()
{
retrun B1::a + B2::a;
}
由于二义性的原因,一个类不可以从同一个类中直接继承一次以上,例如:
class A : public B, public B
{
…
}
这是错误的。
责任编辑:cyth