Effective-cpp-#32

Make sure public inheritance models "is-a"

通常来说,基类是比派生类更加一般化的概念,所以任何希望获得一个基类的函数,都可以接受一个派生类对象作为参数。

通常来说,继承体系都有一个比较明显模型:is-a。但这里经常遇到的问题是,举个例子:

1
2
3
4
5
6
7
8
class Bird {
public:
virtual void fly();
}

class Penguin: public Bird{
...
}

在这个例子中,问题出现在——企鹅是鸟,但企鹅不可以飞。也就是构造了一个不严谨的继承体系。当然,这跟你程序设计有关,有可能你设计时不希望有一个Bird::fly()的函数,那样就不会出现问题。

通常来说,我们希望的是:“public继承”则意味着is-a,也就是说,适用于base class的每一个行为也应该适用于derived class。