在C++的面向对象编程中,继承(Inheritance)是实现代码复用和层次结构的重要特性。通过继承,新的类(派生类)可以从现有的类(基类)中继承属性和行为,从而减少重复代码,并将共同的特性封装在更高层次的基类中。继承不仅使代码更具组织性,还支持多态性和接口共享,使派生类能够在特定场景下提供独特的实现,而不改变原有接口。本文将带你深入探索C++继承的机制、类型以及继承中的关键概念,让你更灵活地构建高效、可扩展的面向对象程序。
1. 继承的概念和定义
1.1 继承的概念
在面向对象编程(OOP)中,继承是一种关键的机制,用于创建层次化的类结构,使代码复用更为方便。继承允许我们定义一个新类(称为派生类或子类),从已有的类(称为基类或父类)继承其属性和行为,并在其基础上进行扩展,增加方法和属性。
继承的核心概念在于“是一种”(is-a)关系——也就是说,派生类是基类的一个具体化或特化版本。
继承的目的是为了复用代码和组织类结构,主要包含以下几点:
(1)代码复用:派生类自动拥有基类的所有属性和方法,因此可以避免重复代码的编写。
(2)层次化结构:通过继承,不同的类可以构成一个层次结构,从而更清晰地表达不同对象之间的关系。比如,在“动物”基类的基础上,可以定义“猫”和“狗”等具体的派生类。
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 = "张三"; // 姓名
int _age = 18; // 年龄
string _address; // 地址
string _tel; // 电话
string _title; // 职称
};
int main()
{
return 0;
}
class Person
{
public:
// 进⼊校园/图书馆/实验室刷⼆维码等⾝份认证
void identity()
{
cout << "void identity()" << _name << endl;
}
protected:
string _name = "张三"; // 姓名
string _address; // 地址
string _tel; // 电话
int _age = 18; // 年龄
};
class Student : public Person
{
public:
// 学习
void study()
{
// ...
}
protected:
int _stuid; // 学号
};
class Teacher : public Person
{
public:
// 授课
void teaching()
{
//...
}
protected:
string title; // 职称
};
int main()
{
Student s;
Teacher t;
s.identity();
t.identity();
return 0;
}
1.2 继承的定义
定义一个派生类(子类)时,可以使用基类(父类)作为其基础,通过不同的访问控制(如 public、protected 或 private)来控制继承的权限。这种继承机制赋予了派生类访问基类的成员,同时也允许派生类扩展或重写基类的功能。
1.2.1 定义的格式
继承方式有public继承、protect继承、private继承三种
访问限定符有public访问、protect访问、private访问三种
1.2.2 继承基类成员访问方式
不同的访问控制符对继承有不同的影响:
1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员虽然被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
2. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。
3. 在实际运用中⼀般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用 protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。
4. public 继承:基类的 `public` 和 `protected` 成员在派生类中保持相同的访问级别。也就是说,基类的 `public` 成员在派生类中仍然是 `public` 的,`protected` 成员仍然是 `protected` 的。
5. protected 继承:基类的 `public` 和 `protected` 成员在派生类中都变成 `protected` 成员。这种继承方式限制了派生类