C++ 在类中的成员函数存在三种声明方式,分别是纯虚函数,虚函数,普通函数。以下面的例子说明:
class Factory {
public:
virtual void run() = 0; // 纯虚函数
virtual void stop(); // 虚函数
int getWorkers() const; // 普通函数
private:
int workers;
};
class CarFactory: public Factory {...}
假设有个 CarFactory 继承上面的 Factory 类。
- 声明纯虚函数,只是为了子类继承其接口,但是其实现需要子类自己实现(Factory 的 run 交给每个工厂自己实现)。
- 声明虚函数,是为了让子类继承其接口和缺省实现,子类可以重写父类的行为(Factory 的提供了一个默认的stop ,子类可以覆盖父类提供自己的 stop)。
- 声明普通函数,是为了让子类继承其接口和实现,而且子类不能重写父类的行为(Factory 的 getWorkers 实现在每个子类中的实现都一致)
使用虚函数
父类规定子类的接口和缺省实现
class AirPlane {
public:
virtual vod fly();
...
};
void AirPlane::fly() // 虚函数的实现
{
// 缺省行为
}
// ModelA 和 ModelB 的 fly 方法使用父类的默认实现
class ModelA: public AirPlane {...}
class ModelB: public AirPlane {...}
使用纯虚函数
父类规定子类需要实现的接口,但纯虚函数也可以拥有自己的实现,可以用来作为缺省实现。
class AirPlane {
public:
virtual vod fly() = 0;
...
};
void AirPlane::fly() // 纯虚函数的实现
{
// 缺省行为
}
class ModelA: public AirPlane {
public:
virtual void fly() {
// 调用纯虚函数,使用父类的缺省行为
AirPlane::fly();
}
};
class ModelB: public AirPlane {
public:
virtual void fly() {
// ModelB 自己的fly操作
}
};
时机
当父类的行为,在子类中的行为一致时,使用虚函数实现。当父类的行为,在每个子类中都不一样时,使用纯虚函数实现,同时这个纯虚函数也可以有实现内容,在子类的实现中调用这个纯虚函数,来达到默认缺省行为。