条款32说过,所谓public继承意味is-a(是一种)的关系。条款34则描述为什么在class内声明一个non-virtual函数会为该class建立一个不变性,凌驾其特异性。如果将这两个观点施行于两个class Base和Derived以及non-virtual成员函数Base::mf身上,那么:
1.适用于Base对象的每一件事,也适用于Derived对象,因为每个Derived对象都是一个Base对象。
2.Base的Derived class一定会继承mf的接口和实现,因为mf是Base的一个non-virtual函数。
如果Derived重新定义mf,你的设计便出现矛盾。如果Derived真有必要实现出与Base不同的mf,并且如果每一个Base对象——不管多么特化——真的必须使用B所提供的mf实现码,那么“每个Derived都是一个Base”就不为真。既然如此Derived就不该以public形式继承Base。另一方面,如果Derived真的必须以public方式继承Base,并且如果Derived真有需要实现出与Base不同的mf,那么mf就无法为B反应出“不变性凌驾特异性”的性质。既然这样mf应该声明为virtual函数。最后,如果每个Derived真的是一个Base,并且如果mf真的为Base反映出“不变性凌驾特异性”的性质,那么Derived便不需要重新定义mf,而且它也不应该尝试这样做。
不论哪一个观点,结论都相同:任何情况下都不该重新定义一个继承而来的non-virtual函数。
要点:
绝对不要重新定义继承而来的non-virtual函数。