单继承或单基派生:派生类只有一个基类;
多继承或多基派生:派生类有两个或两个以上的基类。
4.4.1 多重继承派生类的声明
在C++中,声明具有两个以上的派生类与声明单机派生类的形式相似,只需将要继承的多个基类用逗号分分隔即可,其声明的一般形式如下:
class 派生类名:继承方式1 基类名,...,继承方式n 基类名{
派生类新增的数据成员和成员函数
};
冒号后面的部分称为基类表,各基类之间用逗号分隔,其中“继承方式i”(i=1,2,...,n),规定了派生类从基类中按什么方式继承:private、protected、public。默认的继承方式是private。
例如:
class z:public x,y{ //类z公有继承了类x,私有继承了y(默认的)
...
};
class z:x,public y{ //类z私有继承了类x(默认的),公有继承了y
...
class z:public x,public y{ //类z公有继承了类x和类y
};
在多种继承中,三种继承方式对于基类成员在派生类中的访问属性规则与单继承相同。
//例4.13 多重继承情况下派生类的访问特性。
说明:对基类成员的访问必须是无二义的,例如下列程序段对基类成员的访问是二义的,必须想办法消除二义性。
如定义类Z的对象obj:
Z obj;
则以下对函数f()的访问是二义性的:
obj.f(); //二义性错误,不知调用的是类X的f(),还是类Y的f()
使用成员名限定可以消除二义性,例如:
obj.X::f(); //调用了类X的f()
obj.Y::f(); //调用了类Y的f()
4.4.2 多重继承派生类构造函数和析构函数
多重继承下派生类构造函数的定义形式与单继承派生类构造函数的定义形式相似,只是n个基类的构造函数之间用逗号分隔。多重继承下派生类构造函数定义的一般形式如下:
派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),...,基类名n(参数表n)
{
派生类新增成员的初始化语句
}
多重继承的构造函数的执行顺序与单继承构造函数的执行顺序相同,也是遵循先执行基类的构造函数,在执行对象成员的构造函数,最后执行派生类的构造函数体的原则。处于同一层次的各个基类构造函数的执行顺序,取决于声明派生所指定的各个基类的顺序,与派生类构造函数中所定义的成员初始化列表的各项顺序没有关系。由于析构函数不带参数,在派生类中是否要定义析构函数与它所属的基类无关,所以与单继承情况类似,基类的析构函数不会因为派生类没有析构函数而得不到执行,它们是各自独立的。析构函数的执行顺序与构造函数的执行顺序相反。
例4.14 多重继承情况下派生类构造函数和析构函数的定义方法。
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4912406.html,如需转载请自行联系原作者