成员函数的接口总是会被继承。如条款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函数具体指定接口继承以及强制性实现继承。