多继承(多重继承)
在前面的类继承例子中,基类虽然有多个派生类,但派生类都只有一个基类,称为单继承(Single inheritance)。除此之外,C++也支持多继承(Mutiple inheritance),即一个派生类可以派生自两个以上的多个基类。
需要注意的是:多继承容易让代码逻辑复杂,思路混乱,中小型项目中较少使用
要深入多继承的概念,首先重温一下 继承的三种方式:
公有继承(public),私有继承(private),保护继承(protected)
三种继承方式的说明,如下表所示:
类多继承的语法:
多继承的语法很简单, 将多个基类用逗号隔开即可,例如已声明了类A,类B和类C,且ABC这三个类都当作基类一起派生一个派生类D,那么可以这样来声明派生类D:
class D:public A,protected B,private C //基类出现的顺序为 A - B - C
{
//派生类D的新增成员
};
以上述代码为例,D是多继承形式的派生类,D类以公有的方式继承A类,以保护的方式继承 B 类,以私有的方式继承 C 类,D类根据不同的继承方式来获取ABC三个基类的成员,确定ABC三个基类的成员们在派生类中的访问权限。
类多继承下的类构造函数:
多继承形式下的构造函数和单继承形式基本一致,只要在派生类的构造函数中调用多个基类的构造函数即可,以上述案例的A,B,C,D类为例,派生类D类的构造函数的写法为:
D::D(D构造器的参数列表):A(A构造器的参数列表),B(B构造器的参数列表),C(C构造器的参数列表)
{
D构造器的其他操作
}
注意:🎯
基类们(ABC)的构造函数的在多继承时派生类构造函数中的调用顺序和它们在派生类构造函数中出现的顺序无关,而是取决与声明派生类时,各个基类出现的顺序(继承基类时出现的顺序为A-B-C),即使将D类构造函数写做下面的形式:
D::D(D构造器的参数列表):C(C构造器的参数列表),A(A构造器的参数列表),B(B构造器的参数列表)
{
D构造器的其他操作
}
程序在运行时也是先调用A的构造函数,再调用B类的构造函数,最后再调用C类的构造函数
类多继承情况下的构造函数和析构函数
class D:public A,protected B,private C //基类出现的顺序为 A - B - C
{
//派生类D的新增成员
};
以上述代码为例 程序调用各类的构造函数的顺序为 A-B-C-D,而调用析构函数的顺序为D-C-B-A。这说明多继承形式下析构函数的执行顺序和构造函数的执行顺序是相反的。
类多继承导致的类命名冲突
当两个或多个基类中有同名成员(例如A,B,C
三个基类都有成员函数show()
)的时候,如果直接访问该成员(派生类D类中调用show()
函数),就会产生命名冲突,编译器会进行不明确提示,因为编译器此时不知道该使用哪个基类的成员,这时需要在成员名字的前面加 类名和域解析符::
,便可以 显式的指明到底使用哪个类的成员,以此消除类成员命名冲突导致的命名二义性。
例如以下代码:
//基类A
class BaseA
{
public