您的位置:首页 > 其它

多重继承与虚基类

2015-08-03 21:13 288 查看
多重继承(multiple inheritance,MI)。
MI可能会给程序带来很多问题,其中两个主要的问题是:从两个不同的基类继承同名方法;从两个或更多相关基类那里继承同一个类的多个实例。
虚基类
虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。通过使用关键字virtual。
例如,可以使Worker被用作Singer和Waiter的虚基类(virtual和public的次序无关紧要)。


class Singer : virtual public Worker {...};
class Waiter : virtual public Worker {...};


然后,可以将SingerWaiter类定义为:

class SingerWaiter : public Singer, public Waiter {...};


混合使用虚基类和非虚基类:
当基类是虚基类,派生类将包含基类的一个子对象;如果基类不是虚基类,派生类将包含多个子对象。当类通过多条虚途径和非虚途径继承某个特定的基类时,该类将包含一个表示所有的虚途径的基类子对象和分别表示各条非虚途径的多个基类子对象。
使用非虚基类时,如果类从不同的类那里继承了两个或更多的同名成员(数据或方法),则使用该成员名时,如果没有用类名进行限定,将导致二义性。但如果使用了虚基类,则不一定会导致二义性。这时,如果某个名称优先于(dominate)其它所有名称,则使用它时,即使不用限定符,也不会导致二义性。
派生类中的名称优先于直接或间接祖先类中的相同名称。


MI小结:

使用虚基类的原因:从虚基类的一个或多个实例派生而来的类将只继承一个基类对象。

有间接虚基类的派生类包含直接调用间接基类构造函数的构造函数,这对于间接非虚基类来说是非法的。

通过优先规则解决名称二义性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: