background image


};
class Boy : public Man
{

};
u 注意事项

【规则 10-1-2】看起来很简单,但是实际应用时可能会有意外,继承的概念在程序世界与

现实世界并不完全相同。
例如从生物学角度讲,鸵鸟(Ostrich)是鸟(Bird)的一种,按理说类 Ostrich 应该可以
从类 Bird 派生。但是鸵鸟不能飞,那么 Ostrich::Fly 是什么东西?
class Bird
{
public:
virtual void Fly(void);

};
class Ostrich : public Bird
{

};
例如从数学角度讲,圆(Circle)是一种特殊的椭圆(Ellipse),按理说类 Circle 应该可
以从类 Ellipse 派生。但是椭圆有长轴和短轴,如果圆继承了椭圆的长轴和短轴,岂非画蛇
添足?
所以更加严格的继承规则应当是:若在逻辑上 B 是 A

的 一种 ,并且 A 的所有功能和属

性对 B 而言都有意义,则允许 B 继承 A 的功能和属性。
10.2 组合
l 【规则 10-2-1】若在逻辑上 A 是 B

的 一部分 (a part of),则不允许 B 从 A 派生,而是

要用 A 和其它东西组合出 B。
例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类
Head 应该由类 Eye、Nose、Mouth、Ear 组合而成,不是派生而成。如示例 10-2-1 所示。
class Eye
{
public:
void Look(void);
};
class Nose
{
public:
void Smell(void);
};

class Mouth
{