最近在看《effective C++》,这是一本非常不错,能够指导实际编程的书。在看到第34条款:区分接口继承和实现继承,对类在继承过程中不同类型成员函数表现出来的不同特性有了更深刻的体会。
类中的成员函数从某一方面分为三种:pure virtual函数(纯虚函数),impure virtual函数(非纯虚函数,即简单的虚函数),non-virtual函数(非虚函数),这三种函数的声明分别如下:
virtual ReturnType FunctionName(ParaList) = 0;
virtual ReturnType FunctionName(ParaList);
ReturnType FunctionName(ParaList);
声明了pure virtual函数的类叫做抽象类,抽象类不能用于声明对象,只能用于被继承。在抽象类中,pure virtual函数不一定要有自己的定义(实现)。对于继承抽象类的继承类来说,一定要重新声明这个pure virtual函数,否则不能通过编译。换句话说,继承类必须继承pure virtual函数的接口,并且有自己的实现。
impure virtual函数在多态时用到,基类有自己的实现,作为default实现,如果继承类没有重新实现这个接口,那么基类的实现就是继承类的实现;而如果继承类有自己的实现,那么当对象的动态类型为继承类时,该接口的实现就是继承类的实现。即,继承类继承了基类的接口和默认实现。
non-virtual函数比较暴力,强制继承类这样做,也就是说继承类继承了基类的接口和实现。当然,继承类也可以自己重新声明和实现这样的接口,但是就会把基类的接口给覆盖掉,将不能实现多态,在运行过程中将根据静态类型来调用实现,即你不可能通过基类对象的引用或指针来实现继承类的接口。
以上说的都是public继承函数。