【Linux基础】多继承的二意性

基类有同名成员引起的二意性
多继承时,不同基类可能有同名成员,这样派生类中就可能有从不同基类继承的同名成员,在引用时产生二意性。
2. 从多个路径继承同一个基类引起的二意性
多重继承时,低层的派生类有可能从不同的路径继承同一个基类的成员多次,引用这样的成员时也会产生二意性。

01.jpg (11.96 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

5 天前 上传

例 5 多继承派生产生的二意性。

02.jpg (24.72 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

5 天前 上传

class CDerived : public CBase1,private CBase2

03.jpg (11.78 KB, 下载次数: 0)

下载附件 保存到相册 设为封面

5 天前 上传

{
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/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值