从C语言到C++:面向对象三大特性之继承
在c++面向对象编程(OOP)中,继承(Inheritance) 是最核心、也最容易被初学者误解的概念之一。它不仅影响代码的复用方式,也直接关系到系统的可维护性和扩展性。
本文将从概念、语法、特点、优缺点、使用场景和最佳实践几个方面,系统地介绍类的继承。
一、什么是类的继承
继承是指:
一个类(子类)可以复用另一个类(父类)的属性和方法,并在此基础上进行扩展或重写。
例如,学生是人,狗是动物;如果我们想要描述很多人,每个人都有胳膊,腿等,如果我们对每个人都写一遍这些"胳膊",“腿"等内容,无疑会增加很多无关代码量,所以我们可以把所有人共有的特性写一个父类叫做"人”,其余的每个人都继承这个父类就可以了,只需要再写自身单独的特性。
继承的核心价值体现在三点:
1️⃣ 代码复用
将公共逻辑放到父类中,子类直接使用,减少重复代码。
2️⃣ 逻辑抽象
通过父类抽象出"共性",子类只关注"个性"。
3️⃣ 多态的基础
继承是实现多态的前提,使程序具备更强的扩展能力。
下面我们实现上述例子:
父类中只放所有人共有的特性,比如胳膊、腿,以及通用行为。
#include <iostream>
#include <string>
using namespace std;
// 父类:人 class Person
{ public:
int arms; // 胳膊
int legs; // 腿
Person()
{
arms = 2;
legs = 2;
}
void eat() { cout << "人会吃饭" << endl; }
void walk() { cout << "人会走路" << endl; }
};
定义子类:学生(Student)
学生 是一个人,所以使用 public 继承,只写学生独有的特性和行为。
// 子类:学生
class Student : public Person
{ public:
string school;
Student(string s)
{
school = s;
}
void study()
{
cout << "学生在学习,学校是:" << school << endl;
}
};
定义另一个子类:老师(Teacher)
同样继承Person,但有不同的特性。
// 子类:老师
class Teacher : public Person
{
public:
string subject;
Teacher(string sub)
{
subject = sub;
}
void teach()
{
cout << "老师在教:" << subject << endl;
}
};
二、类的继承方式
在 C++ 中,继承方式决定了:
父类成员在子类中的访问权限
很多初学者在学继承时会混淆:
-
父类自身的
public / protected / private -
子类继承时的
public / protected / private
每个类的自身成员权限有三种,public,protected,private,继承方式也有三种public,protected,private,继承方式决定了子类可不可以访问父类的成员。
2.1 public继承
1️⃣ 规则
class Student : public Person
| 父类成员 | 子类中变成 |
|---|---|
public |
public |
protected |
protected |
private |
不可访问 |
2️⃣ 示例
class Person {
public:
int age;
protected:
string name;
private:
int id;
};
class Student : public Person {
public:
void show() {
age = 18; // OK
name = "Tom"; // OK
// id = 1; // ERROR
}
};
2.2 保护继承
1️⃣ 规则
class Student : protected Person
| 父类成员 | 子类中变成 |
|---|---|
public |
protected |
protected |
protected |
private |
不可访问 |
2️⃣ 示例
class Student : protected Person {
public:
void show() {
age = 18; // OK
name = "Tom"; // OK
}
};
int main() {
Student s;
// s.age = 18; // ERROR(对外不可见)
}
2.3 私有继承
1️⃣ 规则
class Student : private Person
| 父类成员 | 子类中变成 |
|---|---|
public |
private |
protected |
private |
private |
不可访问 |
2️⃣ 示例
class Student : private Person {
public:
void show() {
age = 18; // OK
name = "Tom"; // OK
}
};
int main() {
Student s;
// s.age = 18; // ERROR
}
总结
-
public 继承:权限不变
-
protected 继承:对外隐藏(权限全变protected)
-
private 继承:完全私有(权限全变private)
构造析构顺序:
继承中构造和析构的顺序:
"父子子父":父类先构造------子类再构造------子类析构------父类析构
继承优缺点:继承的优点与缺点
✅ 优点
-
提高代码复用率
-
结构清晰,层次分明
-
支持多态,便于扩展
❌ 缺点
-
父类修改可能影响所有子类
-
类之间耦合度高
-
继承层次过深会增加理解成本
更多推荐


所有评论(0)