一、什么叫继承?
C++中提供了一种方法,可以从已有的类派生出新的类,而派生类继承了原有类(基类)的特征和方法,这叫做继承。
通过继承,可以完成以下工作:
1,可以在已有类的基础上添加新功能
2,可以给类添加新的数据
3,可以修改类的方法
原始类叫作基类,继承类叫作派生类
二、继承时的构造函数问题
派生类不能直接访问基类的私有成员,而必须通过基类方法进行访问。创建派生类对象时,程序首先创建基类对象。除非要使用默认的构造函数,否则必须应显式调用正确的基类构造函数。
1,基类对象先创建
2,派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
3,派生类构造函数要初始化派生类中新增的数据成员
释放对象的顺序与创建对象的顺序相反,首先执行派生类的析构函数,然后自动调用基类的析构函数。
三、派生类和基类之间的特殊关系
基类指针可以在不进行显式类型转换的情况下指向派生类对象;基类引用可以在不进行显示类型转换的情况下引用派生类对象。不过基类指针和引用只能调用基类方法,除非使用虚函数(多态)。
派生类和基类之间的特殊关系是基于c++继承的底层模型的,实际上,c++有三种继承方式:公有继承,保护继承,私有继承。
四、三种继承
公有继承时基类中各成员属性保持不变,基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员
在私有继承中,基类的公有成员和保护成员都成为派生类的私有成员,基类的方法将不会成为派生类对象公有接口的一部分,但可以在派生类中的成员函数中使用基类方法。
在保护继承中,基类的公有成员和保护成员都成为派生类的保护成员。
使用私有继承时,第三代类不能使用基类的接口,只是因为基类的公有方法在派生类中将变成私有方法;使用保护继承时,基类的公有方法在第二代中变成保护方法,因此可以在第三代类中可以使用它们。
特征 | 公有继承 | 私有继承 | 保护继承 |
公有成员变成 | 派生类的公有成员 | 派生类的私有成员 | 派生类的保护成员 |
保护成员变成 | 派生类的保护成员 | 派生类的私有成员 | 派生类的保护成员 |
私有成员变成 | 只能通过基类接口访问 | 只能通过基类接口访问 | 只能通过基类接口访问 |
能否隐式向上转换 | 是 | 否 | 是,但只能在派生类中 |