C++类的继承学习总结
继承定义:
在已有类的基础上创建新类的过程。新的类把原有类作为基类引用,而不需要修改原有类的定义,新定义的类作为派生类引用。
如类B继承A类,或称从类A派生类B(类A称为基类,类B称为派生类)
继承关系的语句格式
Class派生类名:基类名表
{
数据成员和成员函数声明
};
基类名表的语句格式:访问控制基类名1,…,访问控制 基类名n
访问控制是表示继承权限的关键字。如果省略,class默认私有继承,而struct默认公有继承。
Ⅰ:public 公有继承
继承基类中的保护成员和公有成员,成为派生类中的保护成员和公有成员
Ⅱ:private 私有继承
继承基类中的保护成员和公有成员,成为派生类中的私有成员
Ⅲ:protected 保护继承
继承基类中的保护成员和公有成员,成为派生类中的保护成员
注意:C++继承中,派生类吸收基类中除构造函数和析构函数之外的全部成员。基类中的私有成员虽然继承但是在派生类中无法直接使用
Example:
使用:
① 改造:通过在派生类中定义同名成员(包括成员函数和数据成员)使得派生类访问同名成员时屏蔽了基类的同名成员。
若要在派生类中使用基类的同名成员,显式的使用类名限定符:类名::成员
若要在类外使用,应先使用派生类再使用基类::成员
Example:
② 添加:仅继承基类不够,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现,因此子类对象空间总是不小于父类对象空间。
派生类访问基类静态成员
基类中定义的静态成员,将被所有派生类共享
派生类中可通过 类名::成员 来访问静态成员
Example:
在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据,即使用基类构造函数对基类成员进行初始化
(1)当派生类中不含对象成员时
在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
在撤消派生类对象时,析构函数的执行顺序是:派生类的析构函数→基类的析构函数。
(2)当派生类中含有对象成员时
在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。
Example:
派生类构造函数和析构函数的使用原则:
1)基类的构造函数和析构函数不能被继承
2)若基类没有定义构造函数或有无参的构造函数,派生类也可以不用定义构造函数
3)如果基类无无参的构造函数,派生类必须定义构造函数
4)如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造
5)派生类是否定义析构函数与所属的基类无关
总结:
在设计类体系时,应该使基类尽量抽象,表达共性的东西,以减少程序运行的时间和空间等不必要的开销。
在设计系统时,能用到继承的地方有很多,可以减少代码量。