目录
前言
之前我们介绍了 C++中的同名成员。以及访问声明。我们也了解了,声明机制可以个别调整私有派生类,从基类继承下来的成员性质以及访问声明中只含不带类型和参数的函数名或变量的访问。下面主要讲解的就是C++中的多基层以及虚基类。
多继承和虚基类的概念
我们前面介绍的单继承就是说一个类是从另一个基类中派生而来。但现实生活中往往有这样一种情况,就是一个派生类中,有两个或者多个基类,那么这个所得的派生类,就可以从两个或者多个基类中继承它所需要的属性,这种方式是非常方便的,它也可以减少C++中代码的重用性,当一个派生类中具有多个基类,那么我们把这种派生方法就称之为多基派生或者叫做多继承,这也是我们要讲解的内容之一。
声明派生类中多继承的方法
在C++中声明多继承的方法与声明单继承的形式相似,只需要将继承的多个基类之间使用逗号分隔开来就可以,下面我们看个例子,它已经声明了类X和类Y,可以声明多重继承的派生类Z
class Z :public X, public Y { 派生类Z中新增的数据成员和成员函数; };
以下是声明多继承派生类的一般形式:
class 派生类名:继承方式1 基类名2,继承方式2 基类名1,……继承方式n 基类名n{ ………… }
在多继承之中,公有继承以及私有继承,对于基类中的成员来说,在派生类中的访问属性,是与单继承的规则是相同的,但是要说明的一点是,对基类成员的访问必须是无二义性的,比如下面的程序是对基类成员访问是二义性的,所以我们要想办法消除二义性
class A { public: int f(); }; class B { public: int f(); int g(); }; class C : public A, public B { public: int g(); int h(); };
如定义类C的对象obj:
Z obj;
上述的二义性错误,就是不知道调用的是类A的f()还是类B的f(),我们可以使用成员名限定来消除二义性,如下
obj.X::f(); obj.Y::f();
多继承派生类的构造函数和析构函数
多继承派生类的构造函数定义形式是以单继承构造函数的定义形式是相似的,只不过在初始表中包含多个基类的构造函数,与单继承派生内的构造函数相同,多继承派生类中的各种函数也必须同时负责该派生类中所有基类的构造函数的调用,多继承构造函数中的调用顺序,也是单继承构造函数中的调用顺序是相同的,也是先调用基类中的构造函数,然后再调用对象成员函数中的构造函数,最后才调用派生类中的构造函数这一原则,处于同一层次之下的各个基类之间的构造函数调用顺序,就是取决于声明派生类中所指定的定义各个基类之间的顺序与派生类构造函数中定义的成员初始化列表之中的各样顺序是没有关系的,析构函数的调用顺序恰好是与各种函数的调用顺序相反