【文件属性】:
文件名称:用组合代替继承-*重构*改善既有代码的设计(带完整书签)
文件大小:1.28MB
文件格式:PDF
更新时间:2021-06-08 00:09:28
C++ 编程规范
建议4.4 在析构函数中集中释放资源
说明:使用析构函数来集中处理资源清理工作。如果在析构函数之前,资源被释放(如release函数),
请将资源设置为NULL,以保证析构函数不会重复释放。
4.3 继承
继承是面向对象语言的一个基本特性。理解各种继承的含义:“public继承”意味"是...一个",纯虚
函数只继承接口,一般的虚函数继承接口并提供缺省实现,非虚函数继承接口和实现但不允许修改。
继承的层次过多导致理解困难;多重继承会显著增加代码的复杂性,还会带来潜在的混淆。
原则4.4 用组合代替继承
说明:继承和组合都可以复用和扩展现有的能力。如果组合能表示类的关系,那么优先使用组合。
继承实现比较简单直观,但继承在编译时定义,无法在运行时改变;继承对派生类暴露了基类的实现
细节,使派生类与基类耦合性非常强。一旦基类发生变化,派生类随着变化,而且因为派生类无法修
改基类的非虚函数,导致修改基类会影响到各个派生类。
而组合的灵活性较高,代码耦合小,所以优先考虑组合。
但是并非绝对,往往组合和继承是一起使用的,例如组合的元素是抽象的,通过实现抽象来修改组合
的行为。
继承在一般情况下有两类:实现继承(implementation inheritance)和接口继承(interface
inheritance),尽可能不要使用实现继承而考虑用组合替代。
接口继承:只继承成员函数的接口(也就是声明),例如纯虚(pure virtual)函数;实现继承:继
承成员函数的接口和实现,例如虚函数同时继承接口和缺省实现,又能够覆写它们所继承的实现;非
虚函数继承接口,强制性继承实现。
示例:组合是指一个类型嵌入另一个类型的成员变量,即"有一个" 或 "由...来实现"。例如:
class Address{ ... }; //某人居住之处
class PhoneNumber{ ... }; //某人电话号码
class Person