C++中的类继承按成员函数的继承方式可以分为两类:函数接口(声明)继承(Function Interface Inheritance)和函数实现继承(Function Implementation Inheritance)。
而对于进行编程的程序员而言,其所想要的继承方式大概可以分为以下三种:
(1)Derived Class只继承成员函数的接口(声明);
(2)Derived Class同时继承函数的接口和实现,并希望能够重写(Override)所继承的实现;
(3)Derived Class同时继承函数的接口和实现,并且不希望重写任何实现。
C++中的成员函数按虚函数可以分为三类:纯虚函数(pure virtual function)、虚函数(impure virtual function)以及非虚函数(non-virtual function)。
纯虚函数有两个特性:
(1)必须被所有“继承了它”的派生类重新声明并实现;
(2)在抽象类中通常没有定义。
因此,声明一个纯虚函数的目的是为了让派生类只继承接口。
虚函数本身会提供一份实现代码,并且派生类可以对其进行重写。
因此,创建一个虚函数的目的是让派生类继承该函数的接口和缺省实现。
声明非虚函数的目的是为了令派生类继承函数的接口和一份强制性实现,其所代表的意义是不变性(invariant)凌驾于特异性(specialization)
#include <iostream>
using namespace std;
class Airport
{
};
class Airplane
{
public:
virtual void fly(const Airport & destination) = 0;
};
// 函数实现在类定义之外,为非内联;反之,则为inline
// 纯虚函数也可以进行定义
void Airplane::fly(const Airport & destination)
{
cout << "飞机正常起飞了!" << endl;
}
class ModelA : Airplane
{
public:
// 对基类的纯虚函数进行重新声明和定义
virtual void fly(const Airport & destination)
{
// 派生类的定义中要想使用基类的成员函数,可以使用成员运算符
Airplane::fly(destination);
}
};
class ModelB : Airplane
{
public:
virtual void fly(const Airport & destination)
{
Airplane::fly(destination);
}
};
class ModelC : Airplane
{
public:
virtual void fly(const Airport & destination);
};
void ModelC::fly(const Airport & destination)
{
cout << "ModelC飞机起飞了!" << endl;
}
int main()
{
ModelA a;
Airport b;
a.fly(b);
ModelC c;
c.fly(b);
return 0;
}
这么一看,还是直接定义成纯虚函数比较好,防止忘了重写虚函数。