10 - 多继承

本文将简要说说C++多继承的机制,多重继承通常被认为是OOP中一种复杂且不重要的部分。

简介

从语法角度来说,多继承就是一个类可以继承多个类。在内存上,该类对象前面依次为第一个继承的类,第二个继承的类,依此类推。

class Baz : public Foo, public Bar
{
    // ...
};

C++语言中用到多继承的地方主要就是接口模式。相较于 C++,java 直接取消了多继承的功能,添加了接口。

注意的问题

要使用多继承,得注意以下几个问题。

名称冲突

继承的两个父类中有同名方法/成员变量时,就会发生名称冲突。当程序员想要使用它时,编译器将报错,指出使用的方法/成员变量有歧义。

为了消除歧义,可以使用dynamic_cast()显式地将对象向上转型;也可以使用歧义消除语法,如Class::xxxusing Class::xxx

class DogBird : public Dog, public Bird
{
public:
    // class::xxx
    void bark() override
    {
        Dog::bark();
	}
    // using Class::Xxx
    using Bird::eat();
};

歧义基类

即从同一个类继承两次,典型情况就是菱形继承。对于此情况,可以将最顶部的类设置为虚基类,让子类对他虚继承:

class Top
{
public:
    virtual xxxx();
    int xxx;
};

class Mid1 : public virtual Top
{
};

class Mid2 : public virtual Top
{
};

class End : public Mid1, public Mid2
{
};

虚基类在游戏开发中经常使用。使用了虚继承的类会有一个虚继承表,表中存放了父类所有成员变量相对于类的偏移地址。每派生一个类,就会用到该表,如果继承变量和表中偏移地址相同,就只会继承一个。

参考资料

  • 飘零的落花 - 现代C++详解
  • C++20高级编程