虚函数:
virtual void speak(){
cout << "动物在说话" << endl;
}
在类的成员函数前面加上 virtual
关键字,就构成了虚函数。
子类通过重写基类的虚函数来实现多态。
纯虚函数:
virtual void speak()=0;
在虚函数的形参后面写上=0,则虚函数变为纯虚函数,纯虚函数不需要实现,包含纯虚函数的类叫抽象类(也叫接口类),抽象类不能实例化对象。
子类必须重写基类中的纯虚函数才能实例化出对象。
比较:
纯虚函数是一种特殊的虚函数,它没有具体的实现。
虚函数的作用是实现多态(允许用基类的指针来调用子类的这个函数,实现多态)。
当基类的虚函数实现是没有意义的,那么我们就把这个虚函数定义为纯虚函数,这样的纯虚函数不仅能实现多态,更重要的作用是实现了接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
有纯虚函数的类为抽象类,抽象类的作用是作为一个类族的共同基类。抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。
子类如果不提供虚函数的实现,那就会自动调用基类的缺省方案。而子类如果不提供纯虚函数的实现,则编译将会失败。