【C++】区分接口继承和实现继承
利用public继承基类,可以将继承的结果分为两类:函数接口继承和函数实现继承.
声明一个纯函数的目的是为了让派生类只继承函数接口.纯虚函数有两个突出的特性:
它们必须被任何"继承了它们"的具体类重新声明,而且它们在抽象类中通常没有定义.
声明非纯虚函数的目的,是让派生类继承该函数的接口和缺省实现.
声明非虚函数的目的,是为了令派生类继承函数的接口及一份强制性实现.
对class进行设计时,声明成员函数,要谨慎选择,不同类型的声明意味根本意义不相同的事情.
下面是经验不足的设计者最常犯的错误:
1.将所有函数声明为非虚函数,相当派生类继承了函数接口和强制性实现,让派生类没有进行特化工作的空间.
尤其是non-virtual析构函数带来的问题.
但是当设计一个并不想成为基类的类时,应该将其所有成员函数都声明为non-virtual.
2.将所有成员函数都声明为virtual.有时候这样做是正确的,但是有时候一些函数不该在派生类中被重新定义,
这些函数代表继承体系中的不变性.因此,如果类体的不变性凌驾于特异性时,需要将函数声是为non-virtual.
启发:进行面向对象的继承时,类体的设计,至关重要.良好的类体及其继承体系的设计,便于系统的实现,推护和扩展.
因而在成员函数声明时,要注意类体的作用和目的,从而选择合理的声明方式.
参考资料:Effective C++