曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 1715|回复: 0
打印 上一主题 下一主题

多重继承(MI)小结

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2013-12-14 21:41:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先考虑不使用虚基类的 MI,在这种形式下,不会引入新的规则。
如果一个类从两个不同的类那里继承了两个同名的成员,那么就需要在派生类中使用类限定符来区分它们。比如,A 和 B 派生二来的 C,那么要使用 A::draw() 和 B::draw() 来区分从这两个类那里继承的 draw() 方法。否则,编译器将指出二义性。

如果一个类通过多种途径继承了一个非虚基类,则该类从每种途径(如上的 A 途径和 B 途径)分别继承非虚基类的一个实例。在某些情况下,这可能是希望的,且没问题的。但大多数情况下,多个基类实例都是问题!

对于使用虚基类的 MI。当派生类使用使用关键字 virtual 来指示派生时,基类就成为了虚基类,比如:
class marketing : public virtual reality { ... };

主要变化(也是使用虚基类的原因)是:从虚基类的一个或多个实例派生而来的类只继承了一个基类对象。为了实现这种特性,必须满足其它要求:

1. 有间接虚基类的派生类包含直接调用间接基类构造函数的构造函数,这对于间接非虚基类来说是非法的。具体请参考:《使用虚基类时的构造函数规则》。


2. 通过优先规则解决名称二义性。具体请参考:《[虚基类]名称的优先规则

MI 会增加编程的复杂程度。然而,这种复杂性主要是由派生类通过多条途径继承同一个基类引起的。避免这种情况后,唯一需要注意的是,在必要时对继承的名称进行限定。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-17 22:22 , Processed in 0.061715 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表