继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展、增加功能,这样产生新的类,称派生类(或子类)。而被继承的类称基类(或父类)。
继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
为什么需要有继承这个概念呢?
假设这样一个场景:在一个大学里,有本科生和研究生两种学生。无论是本科生还是研究生都有一些相似的特征,如他们都有名字、学号,都有电话等一系列共同的特征。而对于研究生而言,还有导师之类的独特特征。为了提高效率,减少代码冗余,我们可以将名字,学号等公用信息封装到一个类里面供本科生和研究生使用,而对于研究生,就可以在上述类的基础上进行继承,并新增导师信息等,得到研究生类。
class Person
{
public:
void Print()
{
cout << "name:" << _name << endl;
cout << "age:" << _age << endl;
}
protected:
string _name = "peter"; // 姓名
int _age = 18; // 年龄
};
// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。
class Student : public Person
{
protected:
int _stuid; // 学号
};
class Teacher : public Person
{
protected:
int _jobid; // 工号
};
class 新类的名字:继承方式 继承类的名字{};
如上述的class Teacher : public Person
#include
using namespace std;
int main()
{
return 0;
}
![![[Pasted image 20240308210117.png]]](https://1000bd.com/contentImg/2024/03/11/054018581.png)
| 类成员/继承方式 | public继承 | protected继承 | private继承 |
|---|---|---|---|
| 基类的public成员 | 派生类的public成员 | 派生类的protected成员 | 派生类的private成员 |
| 基类的protected成员 | 派生类的protected成员 | 派生类的protected成员 | 派生类的private成员 |
| 基类的private成员 | 在派生类中不可见 | 在派生类中不可见 | 在派生类中不可见 |
总结:
创建一个不能被继承的类
方式1:将父类的构造函数私有,此时子类无法调用父类构造函数因此子类对象无法实例化
方式2:c++11新增,final修饰的类为__最终类__,无法被继承 #finalclass A final { ....... };
- 1
- 2
- 3
- 4
派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中父类那部分切来赋值过去。

基类对象不能赋值给派生类对象。
基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。这里基类如果是多态类型,可以使用RTTI(RunTime Type Information)的dynamic_cast 来进行识别后进行安全转换。
转化是自下而上的,也就是子类向父类转换
隐藏::子类会隐藏父类同名成员
函数名相同就构成隐藏 (返回值和参数可以不相同)
隐藏的原因:编译器会先在子类里面寻找相应成员,找不到才会去父类寻找。如果名称相同,在子类就找到了,不会进入父类
友元关系不能继承,(父亲的朋友不是儿子的朋友,除非父亲介绍你们认识)
基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例 。
因为静态成员是存放在静态区
单继承:一个子类只有一个直接父类时称这个继承关系为单继承
多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承
菱形继承:一种特殊的情形
从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。
在Assistant的对象中Person成员会有两份。
![![[Pasted image 20240310201400.png]]](https://1000bd.com/contentImg/2024/03/11/054018622.png)
解决方式:在腰线位置采用虚拟继承。需要注意的是,虚拟继承不要在其他地方去使用
![![[Pasted image 20240310201641.png]]](https://1000bd.com/contentImg/2024/03/11/054018587.png)