C++进阶:第14章 代码重用与设计模式
学习如何通过组合、私有继承和类模板等高级技术,更智能、更高效地重用你的代码。
包含 (has-a)
像搭乐高一样,将一个类的对象作为另一个类的成员,构建“拥有”关系。
私有继承 (has-a)
一种更隐秘的“拥有”关系,继承实现细节,但不继承接口。
类模板 (泛型)
创建“万能模具”,用一份代码处理不同数据类型,实现终极代码重用。
第一课时:代码重用的模式
环节一:包含:模拟“拥有”(Has-A)关系
最直观的代码重用方式:一个类“拥有”另一个类的对象作为成员。
🚗 汽车与引擎
一个 `Car` 类不需要从 `Engine` 类继承,因为“汽车不是一种引擎”。相反,`Car` 类中应该包含一个 `Engine` 对象,这代表了“汽车拥有一个引擎” (has-a) 的关系。
🎓 学生与成绩
同样,一个 `Student` 类拥有一个姓名 (`string`) 和一组分数 (`valarray`)。我们在 `Student` 类的构造函数中,通过初始化列表来创建这些被“包含”的对象。
代码示例:Student 类的包含关系
环节二&三:私有继承——隐秘的“拥有”
私有继承是实现 has-a 关系的另一种方式,它继承实现,但不继承接口。
互动:选择正确的重用方式
我们要设计一个 `Dog` 类,它需要使用 `Tail` 类的摇摆功能。应该如何设计?
私有继承的本质
基类的 `public` 和 `protected` 成员都成为派生类的 `private` 成员。这意味着,从外部看,派生类对象不能调用基类的任何方法,完美隐藏了基类的接口。
`using` 声明:恢复访问权限
如果希望在私有继承后,有选择地让基类的某个方法在派生类中重新变为 `public`,可以使用 `using Base::method;` 声明。
第二课时:泛型代码重用——类模板
环节四&五:万能容器——类模板
一个栈的推入(push)、弹出(pop)逻辑,无论对整数还是字符串都完全一样。类模板就是为此而生!
万能栈(Stack)模板演示
代码示例:Stack 类模板
环节六:总结与编程挑战
你已经掌握了C++中强大的代码重用技术!现在来试试这些挑战任务吧。
练习 1:Student 类的重用模式
任务:
- 定义一个 `Student_C` 类,使用 **包含** 方式(将 `string` 和 `valarray` 作为私有成员)实现。
- 定义一个 `Student_P` 类,使用 **私有继承** 方式从 `string` 类继承,并 **包含** `valarray` 作为成员。
- 确保两个类都能通过构造函数初始化姓名和分数数组,并提供一个公有方法来显示姓名。
点击查看参考答案
练习 2:栈模板
任务:
编写一个完整的类模板 `Stack`,使其可以存储任何类型的数据,并具有 `push` 和 `pop` 方法。使用一个固定长度为10的数组作为内部存储。