本文定义基类和派生类多基派生类的构造函数派生类的析构函数
定义基类和派生类class派生类名称:派生方法基类名称{添加{private:私有成员列表; public:新公开成员列表; (;
三种数据成员、三种派生方式及访问权限
派生方式privateprotectedpublic基类的成员privateprotectedpublic派生类的成员包括prIvateprivateprotectedpublic派生类的成员
1、基类的private成员在外部和其他类(包括派生类)中都不可见;
2、private派生导致基类的所有非private成员都成为派生类的private成员,外部和其他类无法访问;
3、protected派生会将基类的所有非私有成员降低一个级别。 基类的protected成员成为派生类的private成员,基类的public成员成为派生类的protected成员。
4、对于公共派生,基类的非私有成员在派生类中的访问属性不会改变。
如果多基派生类中只有一个基类,则称为单基派生。
派生类同时具有多个基类,该方法称为多基派生或多重继承。
在c中,声明和定义具有两个或多个基类的派生类的方式类似于声明单个基类。 只需用逗号分隔要继承的多个基类即可。 在以下示例中,派生类c具有两个基类,根据继承规则,类c包含基类a的成员、基类b的成员以及该类自身的成员。
类a {//类定义; 类b {//类定义; 添加到class c :公共a、公共b {//和b的成员列表};二义性问题
一般来说,派生类中对基类成员的访问必须是唯一的,但对于多基继承,如果多个基类中存在同名成员,并且编译器无法确定应该具体访问哪个基类成员,则可以访问基类成员
解决方案:如果两个基类包含同名的数据成员或成员函数,则必须使用成员名限定消除二义性。
在基类的基类派生中,如果多个继承路径具有公共基类,即公共基类。
类a {//类定义; class b :虚拟公共a { }; class c :虚拟公共a { }; 类d :公共b、公共c {//类d源自b类和c类,并且d类对象中还存在来自两个不同路径的公共基本类(a类)的双重副本。 (; 由于公共基类和多基派生的共同作用,派生类中发生多个公共基类的复制,这容易带来二义性问题。
解决方案:使用关键字virtual将公共基类a声明为虚拟基类。
class派生类名称: virtual派生方式基类名称{//类定义}; 关于虚基类需要注意:
1、关键词virtual与派生方式的优先级无关
2 .为了确保公共基类的成员在派生类中只有一个备份,公共基类的所有直接派生类(b类和c类)必须定义为virtual方法。 否则,派生类只能从所有virtual派生的路径中获得公共基类的一个备份,而从其他非virtual派生路径中也只能获得一个备份。
区分虚基类派生二义性和多基派生二义性:
多基派生的二义性主要是成员名称的二义性,通过附加作用域修饰符来解决
另一方面,虚基类派生二义性是基于共同基类成员多重复制的存储二义性,通过添加virtual派生来解决。
派生类的构造函数派生时,构造函数和析构函数都不能继承,并且必须为派生类重新定义构造函数和析构函数。
派生类对象包含基类数据成员的值,所以要创建派生类对象,系统首先通过派生类的构造函数调用基类的构造函数,完成基类成员的初始化,然后派生类
派生类名称(派生类构建函数参数表) :基类构建函数(基类构建函数参数表) (/函数体); 派生类的构造函数按以下顺序实现功能:
1 .完成对象所占内存的开拓在系统调用构造函数时自动完成;
2、调用基类构造函数完成基类成员的初始化
3、如果派生类包含对象成员、const成员或引用成员,则必须在初始化表中完成初始化;
4、派生类结构函数体的执行
派生类的构造函数调用基类的构造函数,在初始化表达式中为构造函数表达式,对象成员在初始化时在初始化表达式中为对象名称和初始化参数。
派生类的析构函数也不可继承,因此,当您执行派生类的析构函数时,将自动调用基类的析构函数。
执行顺序:执行派生类的析构函数,然后执行基类的析构函数,这与执行构造函数的顺序相反。