在虚函数声明的参数列表后面加上“=0”;
class C { virtual void f() = 0; };
就将使该函数变成纯虚函数。我们在此不需要为纯虚函数 C::f()提供任何的定义。那些声明(或继承)了纯虚函数的类就是抽象基类。任何试图创建一个抽象基类对象的操作都将导致编译期错误的产生。
如果一个类派生自C并重写了C::f,它就将成为具体类:
class D : public c { void f(); };
我们通常都将抽象基类用于接口的声明,这时我们不需要为该接口声明一个完整的实现。该接口描述了所有派生自该类的对象都应该支持的抽象操作;派生类必须实现这些抽象操作。例如:
class Vehicle { public: virtual double accelerate(double) = 0; virtual double speed() = 0; };
由于Vehicle是一个抽象类,任何创建Vehicle对象的尝试都会导致编译期错误的产生: Vehicle v;//编译期错误:“Vehicle”是抽象类为了使用Vehicle,我们必须从它从它派生出其它的具体类:
class Car : public Vehicle { public: virtual double accelerate(double); virtua; double speed(); }; class Bicycle : public Vehicle { public: virtual double accelerate(double); virtua; double speed(); };
由于在Car和Bicycle众,基类中的所有纯虚函数都被重写了,所以我们就可以得到由这两个类构建出来的对象。即使我们得不到Vehicle对象,我们仍然可以使用指向Vehicle的指针和引用;
void full_stop(Vehicle& v) { v.accelerate(-v.speed()); }
一个继承(而没有重写)了纯虚函数的类同样也是一个抽象类:
class Land_vehicle : public Vehicle { }; Land_vehicle v; //编译期错误:Land_vehicle是一个抽象类