10 - 多继承
本文将简要说说C++多继承的机制,多重继承通常被认为是OOP中一种复杂且不重要的部分。
简介
从语法角度来说,多继承就是一个类可以继承多个类。在内存上,该类对象前面依次为第一个继承的类,第二个继承的类,依此类推。
class Baz : public Foo, public Bar
{
// ...
};
C++语言中用到多继承的地方主要就是接口模式。相较于 C++,java 直接取消了多继承的功能,添加了接口。
注意的问题
要使用多继承,得注意以下几个问题。
名称冲突
继承的两个父类中有同名方法/成员变量时,就会发生名称冲突。当程序员想要使用它时,编译器将报错,指出使用的方法/成员变量有歧义。
为了消除歧义,可以使用dynamic_cast()
显式地将对象向上转型;也可以使用歧义消除语法,如Class::xxx
或using 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高级编程