class
{
virtual function_name()=0;
…
};
在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。纯虚函数不必在基类中定义,但必须在派生类中被覆盖(override)的函数。通过新奇的“=0”语法将该函数指针指向空,从而就算定义了也无法访问,例如:
class Base{
public:
void f1();//不是虚函数
virtual voidf2();//是虚函数,但不是纯虚函数
virtual voidf3()=0;//纯虚函数
};
Base b;//error:purevirtualf3notoverridden
在此,Base是抽象类(因为它有一个纯虚函数),所以不能直接用它来定义对象:Base(很显然)是用来做基类的。例如:
class Derived: public Base{
//没有定义f1:没关系
//没有定义f2:没关系,继承了Base::f2
void f3();
};
Derived d;//ok:Derived::f3覆盖了Base::f3
抽象类是定义接口的非常好的工具。事实上,一个只有纯虚函数的类通常被称为接口。
当然你也可以定义纯虚函数:
Base::f3(){/*...*/}
这样做往往意义不大(虽然这样做可为派生类提供一些简单的公共代码),而且在派生类中仍然需要覆盖Base::f3()。
如果你没有在派生类中覆盖纯虚函数,那该派生类也是抽象类:
class D2:public Base{
//没有定义f1:没关系
//没有定义f2:没关系,继承了Base::f2
//没有定义f3:没关系,但D2因此也是抽象类
};