C++启蒙课程:第14章 C++中的代码重用
我们将学习 `is-a` 之外的代码重用策略!掌握 `has-a`(拥有)关系、私有继承和“万能蓝图” `template`!
拥有关系:包含 (has-a)
学习 "Car has-a Motor"(汽车拥有马达)关系,用“乐高积木”的方式组合类。
万能蓝图:类模板
掌握“可变类型”的 `template` 蓝图,制造能处理任何数据的“堆栈机”。
多血统英雄:多重继承
学习如何创建“超级英雄混血儿”,同时继承“飞行”和“力量”两种能力。
课时一:拥有关系:包含与继承的区别
(覆盖知识点 14.1)
"has-a" 关系 (包含)
包含(Composition)模拟 "has-a"(拥有)关系。Car 类对象内部“包含”一个 Engine 对象,就像安装一个马达组件。
"has-a" 关系 (私有继承)
私有继承也模拟 "has-a"。Motor 的公有方法 `Start()` 在 Car 内部变为私有,戴上了“安全帽” 👷,外界无法直接访问。
Car : private Motor 👷课时二:万能蓝图:类模板
(覆盖知识点 14.2)
"万能工厂蓝图" (类模板)
类模板 (template ) 是一张“万能蓝图”。编译器会根据你提供的类型 (int 或 string),自动“实例化”一个专门的类。
💡 互动:堆栈机
Stack (待机)
📜 代码支撑:
课时三:多血统英雄与重用总结
(覆盖知识点 14.3)
“超级英雄混血儿” (多重继承)
C++允许一个类同时继承多个基类,就像一个“混血儿”英雄,同时拥有“飞行者”的飞行能力和“大力士”的力量。
+ Sing()
+ Dance()
编程实践与作业
是时候检验你作为“代码重用大师”的实力了!
练习 1:has-a 关系 (包含)
任务:
设计一个 `Engine` 类 (有 `Start()` 方法) 和一个 `Car` 类。使用**包含(Composition)**模拟 "Car has-a Engine" 关系,并提供 `Car::StartCar()` 方法。
点击查看参考答案
练习 2:万能蓝图 (Stack 模板)
任务:
编写一个简单的 `Stack` 类模板,使其能够处理 `int` 和 `double` 两种类型的数据。
点击查看参考答案
练习 3:多血统英雄 (多重继承)
任务:
编写基类 `Singer` 和 `Dancer`。然后编写 `Performer` 类,使用多重公有继承同时继承这两个类。
点击查看参考答案
本章知识点总结与复习
| 核心概念 | 解释/功能 | 关键用法/示例 |
|---|---|---|
| 公有继承 (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 {} |