C++中的公有继承(public)问题

来源:互联网 发布:gta5 知乎 编辑:程序博客网 时间:2024/05/05 10:51
我们知道,在C++中有三种继承方式:private(私有继承)、protected(保护继承)、public(公有继承)。其中公有继承(public)意味着“is-a”(是一种)的关系。例如:汽车(类)继承自车(类),那汽车(类)肯定是一种车(类),汽车(类)将拥有车(类)的所有特性;但车(类)并不一定是汽车(类)。

但是,这种情况或者说是理解、运用,有时候是错的,是行不通的,导致的结果就是我们不能用public继承。举个例子,企鹅是一种鸟,那当我们定义企鹅类时,可以public继承自鸟类,也就是说企鹅将拥有鸟的所有特性;但是我们又知道,鸟有一种特性就是——飞,所以,企鹅也应该会”飞“,而现实中的企鹅是不会”飞“的。这是不是矛盾了。

其实,这也不矛盾。原因是:我们不能把C++的继承不能适应于所有的现实情况(不光C++,其他编程语言也不是万能的),换句话说,C++有它的局限性。世界是复杂的,而C++是不能复杂的(其实C++已经够复杂了,C++是所有编程语言最复杂的一个了),如果C++太复杂了,那将没人有能力使用它。

相同的例子还有几个。在数学上,我们认为“正方形是矩形“,但在C++OOP编程时,不能这么认为,因为如果可以的话,正方形类就可以继承自矩形类,这样正方形类就拥有矩形类所有的特性;然而,这种特性在某种性质(比如改变宽或高)上却是错误的——矩形改变高(或宽)时不会改变宽(或高),但正方形改变高(或宽)时会改变宽(或高)。

世界上没有一个完美的东西,所以也就没有一个”适用于所有软件“的完美设计。所谓最佳设计,取决于系统希望做什么事,包括现在与未来。我们不能太对C++苛刻,其实C++已经很好了。正如C++的发明者Bjarne Stroustrup博士曾说,世界上并不存在万能的编程语言,每门编程语言都有它的自己的领域。其实,我们所说的“万能的编程语言"是指它所应用的领域是所更加地广泛。


注:本文根据《More Effective C++》整理而成。