C++中的继承(上)
2026/6/1 15:35:21 网站建设 项目流程

1.继承的概念及定义

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保
持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象
程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继
承是类设计层次的复用。

基类(父类):被继承的类,提供公共的属性和方法。
派生类(子类):继承基类的类,可以复用基类功能,也能扩展新功能。

2、继承的语法

// 基类 class 基类名 { // 成员 }; // 派生类:继承方式 基类名 class 派生类名 : 继承方式 基类名 { // 新增成员 };

3.继承方式


决定了基类成员在派生类中的访问权限:

继承方式基类public成员基类protected成员基类private成员
公有继承(public)仍为public仍为protected不可直接访问
保护继承(protected)变为protected变为protected不可直接访问
私有继承(private)变为private变为private不可直接访问

4.完整演示

我们用 Person(人)作为基类,Student(学生)作为派生类演示:

#include <iostream> #include <string> using namespace std; // 基类:人类 class Person { // 受保护权限:子类可以访问,外部不能访问 protected: string name; int age; public: // 基类构造函数 Person(string n, int a) : name(n), age(a) {} // 公共方法 void showInfo() { cout << "姓名:" << name << ",年龄:" << age << endl; } }; // 派生类:学生类 公有继承 Person class Student : public Person { private: // 子类新增成员 int studentId; public: // 子类构造函数:必须先调用基类构造函数 Student(string n, int a, int id) : Person(n, a), studentId(id) {} // 子类新增方法 void study() { // 直接使用基类的 protected 成员 cout << name << "正在学习,学号:" << studentId << endl; } }; int main() { // 创建子类对象 Student s("张三", 20, 1001); // 调用继承自基类的方法 s.showInfo(); // 调用子类自己的方法 s.study(); return 0; }

5.基类和派生类对象赋值转换

在 C++ 公有继承 下,基类和派生类的对象、指针、引用可以进行赋值转换,这是面向对象中向上转型的基础,也是多态的前提!

只有 公有继承(public) 才能做这种赋值转换,保护 / 私有继承会因为权限问题直接报错。

我们沿用 Person(基类)、Student(派生类)举例:

#include <iostream> #include <string> using namespace std; // 基类 class Person { protected: string name; public: Person(string n) : name(n) {} void show() { cout << "人:" << name << endl; } }; // 派生类(公有继承) class Student : public Person { private: int id; // 派生类独有成员 public: Student(string n, int i) : Person(n), id(i) {} void study() { cout << name << " 学习,学号:" << id << endl; } };
1. 基类对象 = 派生类对象(对象赋值)

派生类赋值给基类对象时,会发生 切片(截断):
只拷贝基类的成员,派生类独有的成员会被切掉,基类对象无法访问派生类新增成员。

int main() { Student s("张三", 1001); Person p = s; // ✅ 合法:派生类 → 基类对象 p.show(); // 正常调用基类方法 // p.study(); // ❌ 报错!切片后丢失了派生类的成员和方法 return 0; }
2. 基类引用 = 派生类对象(推荐,无切片)

基类引用可以直接绑定派生类对象,不发生拷贝,无切片,效率更高!

Student s("李四", 1002); Person& ref = s; // ✅ 合法:基类引用绑定派生类对象 ref.show(); // 调用基类方法 // ref.study(); // ❌ 报错!引用类型是基类,无法访问派生类独有方法
3. 基类指针 = 派生类对象地址(最常用,多态基础)

基类指针可以直接指向派生类对象,无切片,是 C++ 多态的核心用法!

Student s("王五", 1003); Person* ptr = &s; // ✅ 合法:基类指针指向派生类对象 ptr->show(); // 调用基类方法 // ptr->study(); // ❌ 报错!指针类型是基类,无法访问派生类独有方法
4.反向赋值(绝对不允许)

基类对象 不能 赋值给派生类对象 / 引用 / 指针!
原因:基类没有派生类的独有成员,会导致数据缺失,编译直接报错。

Person p("赵六"); // Student s = p; // ❌ 报错 // Student& ref = p; // ❌ 报错 // Student* ptr = &p; // ❌ 报错

总结:

公有继承下:
派生类对象 → 基类对象 / 引用 / 指针:自动安全,向上转型
对象赋值会切片,指针 / 引用无切片
基类对象 → 派生类:直接报错,禁止使用
基类指针 / 引用指向派生类是 C++ 多态的基础

谢谢

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询