多继承中的二义性问题
(2008-07-30 16:13:39)
标签:
it |
分类: C 基础 |
一般地讲,在派生类中对基类成员的访问是唯一的。但是,在有多继承的情况下,可能会造成派生类对基类成员访问的不唯一性,即二义性。
可能出现二义性问题的两种情况:
1.调用不同基类的相同成员时可能出现二义性。
#include<iostream.h>
class A
{
public:
void
f();
};
class B
{
public:
void
f();
void
g();
};
class C:public A,public B
{
public:
void
g();
void
h();
};
定义派生类C的一个对象c1: C c1;
这时,"c1.f()"便存在二义性。f()函数不知道是类A中的还是类B的。
解决的方法可以使用作用域运算符,用类名对成员加以限定。
例如:c1.A::f(); 或者 c1.B::f();
同时还需要注意的一点,这里c1.g()不存在二义性。虽然类B中有g()成员,类C中也有g()成员。但是由于一个在派生类中,另一个在基类中,规定派生类的成员支配基类的同名成员。因此,c1.g()中的g()应该是派生类C中的g(),而不是基类中的g().
2.访问共同基类的成员时可能出现二义性。
当一个派生类有多个基类,而这些基类又有一个共同的基类,这是对这个共同的基类中成员的访问可能出现二义性。
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: C c1;
c1.a与c1.A::a都具有二义性。
为消除二义性可以写成c1.B1::a;c1.B2::a。
另外还可以将类A说明为虚基类,使公共基类在派生类中只产生一个基类子对象,从而消除二义性。
可能出现二义性问题的两种情况:
1.调用不同基类的相同成员时可能出现二义性。
#include<iostream.h>
class A
{
public:
};
class B
{
public:
};
class C:public A,public B
{
public:
};
定义派生类C的一个对象c1: C c1;
这时,"c1.f()"便存在二义性。f()函数不知道是类A中的还是类B的。
解决的方法可以使用作用域运算符,用类名对成员加以限定。
例如:c1.A::f(); 或者 c1.B::f();
同时还需要注意的一点,这里c1.g()不存在二义性。虽然类B中有g()成员,类C中也有g()成员。但是由于一个在派生类中,另一个在基类中,规定派生类的成员支配基类的同名成员。因此,c1.g()中的g()应该是派生类C中的g(),而不是基类中的g().
2.访问共同基类的成员时可能出现二义性。
当一个派生类有多个基类,而这些基类又有一个共同的基类,这是对这个共同的基类中成员的访问可能出现二义性。
class A
{
{;
class B1:public A
{
};
class B2:public A
{
};
class C:public B1,public B2
{
};
定义类C的对象c1: C c1;
c1.a与c1.A::a都具有二义性。
为消除二义性可以写成c1.B1::a;c1.B2::a。
另外还可以将类A说明为虚基类,使公共基类在派生类中只产生一个基类子对象,从而消除二义性。
前一篇:派生类对基类成员的访问权限
后一篇:C++子对象和堆对象