读书笔记《Effective C++》条款34:区分接口继承和实现继承

成员函数的接口总是会被继承。如条款32所说,public继承意味is-a,所以对base class为真的任何事情一定也对其derived class为真。因此如果某个函数可施行于某class身上,一定也可施行于其derived class身上。

声明一个pure virtual函数的目的是为了让derived class只继承函数接口。

声明impure virtual函数的目的,是让derived class继承该函数的接口和缺省实现。如果derived class中没有从新定义impure virtual,将使用base class中的缺省impure virtual行为。

如果成员函数是个non-virtual函数,意味是它并不打算在derived class中有不同的行为。声明non-virtual函数的目的是为了令derived class继承函数的接口及一份强制性实现

由于non-virtual函数代表的意义是不变性凌驾特异性,所以它绝不该在derived class中被重新定义。

pure virtual函数、simple(impure)virtual函数、non-virtual函数之间的差异,使你得以精确指定你想要derived class继承的东西:只继承接口,或是继承接口和一份缺省实现,或是继承接口和一份强制实现。由于这些不同类型的声明意味根本意义并不相同的事情,当你声明你的成员函数时,必须要谨慎选择。应该能够避免经验不足的class设计者最常犯的两个错误。

第一个错误是将所有函数声明为non-virtual。这使得derived class没有余裕空间进行特化工作。实际上任何class如果打算被用来当做一个base class,都会拥有若干virtual函数(再次见条款7)。

另一个常见错误是将所有成员函数声明为virtual。有些时候这样做是正确的,比如条款31的interface class。然而这也可能是class设计者缺乏坚定立场的前兆。某些函数就是不该在derived class中被重新定义,果真如此你应该将那些函数声明为non-virtual。没有人有权利妄称你的class要适用于任何人任何事任何物,而他们只需要花店时间重新定义你的函数就可以享受一切。如果你的不变性凌驾特异性,别害怕说出来。


要点:

1.接口继承和实现继承不同。在public继承之下,derived class总是继承base class的接口。

2.pure virtual函数只具体指定接口继承。

3.impure virtual函数具体指定接口继承及缺省实现继承。

4.non-virtual函数具体指定接口继承以及强制性实现继承。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值