基类有同名成员引起的二意性
}
}
多继承时,不同基类可能有同名成员,这样派生类中就可能有从不同基类继承的同名成员,在引用时产生二意性。
2. 从多个路径继承同一个基类引起的二意性
多重继承时,低层的派生类有可能从不同的路径继承同一个基类的成员多次,引用这样的成员时也会产生二意性。
例 5 多继承派生产生的二意性。
class CDerived : public CBase1,private CBase2
{
protected:
int d;
public:
CDerived(int x,int y, int z):CBase1(x),CBase2(y)
{
d=z;
}
void Output()
{
cout << d << b << endl; // Error: CDerived::b' is ambiguous
产生二意性,因为不知道访问哪一个基类继承来的b,可使用域运算符和基类名来限定,改为:CBase1::b或CBase2::b |
};
void main()
{
CDerived d1(1,2,3);
int x = d1.GetB(); // Error: CDerived::GetB' is ambiguous
d1.Output();
产生二意性,改为:d1.CBase1::GetB() |
虚基类
为了避免在派生类中从不同路径继承间接基类多次,可以通过将间接基类声明为虚基类,虚基类的成员在它的间接派生类中只被继承一次。
1. 虚基类的声明
class 派生类名 :virtual 继承方式 基类名
2. 含有虚基类派生类的构造过程
派生类对象的构造顺序:
(1)按定义顺序自左至右地构造所有虚基类;
(2)按定义顺序构造派生类的所有直接基类;
(3)按定义顺序构造派生类的所有数据成员,包括对象成员、const成员和引用成员;
(4)执行派生类自身的构造函数体。派生类对象的析构顺序与构造顺序相反
本文转载于唯C教育,【Linux基础】多继承的二意性
http://www.weicedu.com/forum.php?mod=viewthread&tid=85&fromuid=4
(出处: http://www.weicedu.com/)
http://www.weicedu.com/forum.php?mod=viewthread&tid=85&fromuid=4
(出处: http://www.weicedu.com/)