C++启蒙课程:第14章  C++中的代码重用

我们将学习 `is-a` 之外的代码重用策略!掌握 `has-a`(拥有)关系、私有继承和“万能蓝图” `template`!

🧩

拥有关系:包含 (has-a)

学习 "Car has-a Motor"(汽车拥有马达)关系,用“乐高积木”的方式组合类。

🌀

万能蓝图:类模板

掌握“可变类型”的 `template` 蓝图,制造能处理任何数据的“堆栈机”。

🦸

多血统英雄:多重继承

学习如何创建“超级英雄混血儿”,同时继承“飞行”和“力量”两种能力。

课时一:拥有关系:包含与继承的区别

(覆盖知识点 14.1)

"has-a" 关系 (包含)

包含(Composition)模拟 "has-a"(拥有)关系。Car 类对象内部“包含”一个 Engine 对象,就像安装一个马达组件。

Car 蓝图
Engine
class Engine { ... }; // 14.1 包含 (Composition) class Car { private: // Car "has-a" Engine Engine engine; };

"has-a" 关系 (私有继承)

私有继承也模拟 "has-a"。Motor 的公有方法 `Start()` 在 Car 内部变为私有,戴上了“安全帽” 👷,外界无法直接访问。

Car : private Motor 👷
class Motor { public: void Start(); }; // 14.1 私有继承 class Car : private Motor { public: void StartCar() { Start(); // OK! (内部访问) } }; // car.Start(); // 错误!(外部无法访问)

课时二:万能蓝图:类模板

(覆盖知识点 14.2)

"万能工厂蓝图" (类模板)

类模板 (template ) 是一张“万能蓝图”。编译器会根据你提供的类型 (intstring),自动“实例化”一个专门的类。

💡 互动:堆栈机

Stack (待机)

📜 代码支撑:

// 14.2 万能蓝图 template class Stack { private: T items[10]; // T 可以是 int, double, string... int top; public: Stack(); bool push(const T & item); bool pop(T & item); }; // 14.2 实例化 (创建具体类) Stack int_stack; Stack string_stack;

课时三:多血统英雄与重用总结

(覆盖知识点 14.3)

“超级英雄混血儿” (多重继承)

C++允许一个类同时继承多个基类,就像一个“混血儿”英雄,同时拥有“飞行者”的飞行能力和“大力士”的力量。

Singer
+ Sing()
Dancer
+ Dance()
Performer
+ Sing() (来自 Singer)
+ Dance() (来自 Dancer)
+ Perform() (自己的)
class Singer { public: void Sing(); }; class Dancer { public: void Dance(); }; // 14.3 多重公有继承 class Performer : public Singer, public Dancer { public: void Perform() { Sing(); // 继承自 Singer Dance(); // 继承自 Dancer } };

编程实践与作业

是时候检验你作为“代码重用大师”的实力了!

练习 1:has-a 关系 (包含)

任务:

设计一个 `Engine` 类 (有 `Start()` 方法) 和一个 `Car` 类。使用**包含(Composition)**模拟 "Car has-a Engine" 关系,并提供 `Car::StartCar()` 方法。

点击查看参考答案
#include <iostream> using namespace std; class Engine { public: void Start() const { cout << "Engine: 马达启动!" << endl; } }; class Car { private: // 14.1 包含 (Composition) Engine engine; public: void StartCar() { cout << "Car: 准备启动..." << endl; engine.Start(); // 调用内部对象的方法 } };
练习 2:万能蓝图 (Stack 模板)

任务:

编写一个简单的 `Stack` 类模板,使其能够处理 `int` 和 `double` 两种类型的数据。

点击查看参考答案
#include <iostream> using namespace std; // 14.2 类模板定义 template <typename T> class Stack { private: enum { MAX = 5 }; T items[MAX]; // 泛型 T int top; public: Stack() : top(0) {} bool push(const T & item) { if (top < MAX) { items[top++] = item; return true; } return false; } // ... (pop, etc.) }; int main() { // 14.2 实例化 Stack<int> int_stack; int_stack.push(10); Stack<double> double_stack; double_stack.push(3.14); return 0; }
练习 3:多血统英雄 (多重继承)

任务:

编写基类 `Singer` 和 `Dancer`。然后编写 `Performer` 类,使用多重公有继承同时继承这两个类。

点击查看参考答案
#include <iostream> using namespace std; class Singer { public: void Sing() const { cout << "正在唱歌!" << endl; } }; class Dancer { public: void Dance() const { cout << "正在跳舞!" << endl; } }; // 14.3 多重公有继承 class Performer : public Singer, public Dancer { public: void Perform() const { Sing(); // 继承自 Singer Dance(); // 继承自 Dancer } };

本章知识点总结与复习

核心概念 解释/功能 关键用法/示例
公有继承 (is-a)模拟“是一种”关系 (Car is-a Vehicle)。class Car : public Vehicle {}
包含 (has-a)一个类包含另一个类的对象,模拟“拥有”关系。class Car { Engine e; };
私有/保护继承 (has-a)也模拟“拥有”关系,但用于重用实现细节。class Car : private Motor {}
类模板“万能蓝图”,使用泛型 (T) 定义类。template <typename T> class Stack;
模板实例化根据具体类型(如 int)从模板生成一个类。Stack<int> my_stack;
多重公有继承一个类可以从多个基类派生而来。class C : public A, public B {}