读书笔记《Effective C++》条款36:绝不重新定义继承而来的non-virtual函数

条款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函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值