学习C++有一段时间了,今天就来总结一下C++的第二个特性——继承。
首先介绍一下继承的概念,所谓的继承就是用已有的类(基类),根据实际需要定义新的类(派生类)的过程,其实质是代码复用。继承关系如下图所示:
当然,派生类的数据并不是全部来自于基类,也可以根据需要在派生类中添加额外的成员变量和成员方法。
继承的语法结构: 类标识 派生类类名:继承方式:基类类名
继承方式有3种:public protected private
其中,采用public继承方式的派生类访问不受限制,采用protected继承方式的派生类只允许在本类和子类类中访问,而采用private继承方式的派生类只允许在本类类中访问。
说到这里可能会有人产生疑问,是不是派生类的访问限定只跟继承方式有关呢?其实并不是这样的,
不同访问限定符修饰的基类,采用不同的继承方式继承后,其派生类的访问限定也是不一样的。其关系如下图所示:
继承应该考虑的问题
1、派生类的构造和析构顺秀
系统在创建派生类对象时,会先调用基类的构造函数,用于初始化继承的数据成员,然后再调用派生类的构造函数,用于初始化新增的数据成员。派生类的构造函数总是调用一个基类的构造函数,并使用初始化器列表指明要使用那个基类的构造函数,否则将使用默认的基类的构造函数。
销毁对象时,与调用构造函数的顺序相反,系统会先调用派生类的析构函数,然后再调用基类析构函数。
2、派生类和基类的关系
派生类可以使用基类非私有的方法;
基类指针(或引用)可以不进行显式类型转换的情况下指向(或引用)派生类对象;
基类指针(或引用)只能调用基类的方法,不能调用派生类的方法。
3、继承的范围
派生类****不能通过继承继承基类的构造函数、析构函数和赋值运算符。
一般,派生类在创建对象时,会使用成员初始化列表调用基类的构造函数,用来创建派生对象的基类部分,否则将使用基类的默认构造函数。在继承链中,每一个类都可以使用成员初始化列表将信息传递给相邻的基类。
派生类在销毁对象时,程序会先调用派生类的析构函数,然后再调用基类的析构函数。如果基类有默认析构函数,编译器将为派生类生成默认析构函数。一般,基类的析构函数设置为虚的。
赋值运算符不能继承的原因是,派生类继承的方法的特征标与基类完全相同,但赋值运算符的特征标随类而异。
总的来说,派生类通过继承继承了基类除构造函数、析构函数赋值运算符之外的所有成员,包括类型和作用域。