一、继承是什么?解决了什么问题?
在面向对象编程中,复用是永恒的追求。函数实现了代码块的复用,而继承将复用提升到了类设计的层次。
以设计 Student(学生)和 Teacher(老师)两个类为例,两者都有姓名、地址、电话、年龄等共性属性,以及身份认证等共性行为;但也有差异 —— 学生有学号和学习方法,老师有职称和授课方法。
如果不使用继承,代码会存在大量冗余:
// 学生类
class Student {
public:
void identity() {} // 重复定义
void study() {}
protected:
string _name = "peter";
string _address;
string _tel;
int _age = 18;
int _stuid;
};
// 老师类
class Teacher {
public:
void identity() {} // 重复定义
void teaching() {}
protected:
string _name = "张三";
string _address;
string _tel;
int _age = 18;
string _title;
};
identity() 方法和 4 个属性完全重复,增加了代码量且埋下修改隐患。继承的核心思想是将共性抽离成基类(父类),让派生类(子类)继承特性并补充独有内容。
重构后的代码:
// 基类:抽离共性
class Person {
public:
void identity { cout << << _name << endl; }
:
string _name = ;
string _address;
string _tel;
_age = ;
};
: Person {
:
{}
:
_stuid;
};
: Person {
:
{}
:
string _title;
};
{
Student s;
Teacher t;
s.();
t.();
;
}


