03 Designing with Classes
C++ 提供了大量功能来支持面向对象编程。
首先,类(class
)是封装数据和操作的对象,一般用于描述对象的分类,比如猴子。对象(object
)是类的实例(instance
),比如这只猴子。属性(property
)一般而言就是类的数据,用于描述对象的特征,比如猴子的颜色。行为(behavior
)是类的成员函数,描述对象能做什么或者能对对象做什么操作,比如猴子能跑。
类之间的关系有两种。
第一种是 has-a,类包含其他类的对象,一般而言有两种 has-a 的关系。1)聚合,聚合器销毁了但是被聚合的对象还在,比如动物园和小动物,动物园不在了,动物可以还在,比如转移走了。2)组合,更常见的一种语义,比如飞机有翅膀,销毁飞机,翅膀也会销毁。
第二种是 is-a,类继承其他类。
两个类之间的关系有时很清楚,有时不清楚,不清楚的时候,倾向于 has-a。
其实,两个类之间也可以没有任何关系,两个类之间没有关系就不要硬联系。比如两个类,子类没有特别的属性或者成员函数,不要强行派生一个子类;除了抽象类之外,如果一个继承类 override 了所有函数,那么也不必强行发生关系。
C++ 提供了多重继承的能力,用不好会导致很多问题。比如从类的继承角度看会非常复杂,比如实现的时候两个基类有同样的函数但是实现不同要怎么办等。因此很多新的编程语言只支持多继承接口(可以看作是抽象基类),能避免很多不必要的问题。其实 C++ 也可以这么用。比如一个图片按钮,可以是两个基类 Image
和 Button
的子类,也可以是 Image
的子类,同时实现 Clickable
抽象基类。