纯虚函数
含有纯虚函数的类是抽象类,抽象类不能实例化对象。
仅含有纯虚函数的类叫接口类(无成员变量)。
如果某个类的虚函数没有被实现,则该类不能实例化对象。
如果想要派生类实现虚函数,则基类的虚函数置0(此时为纯虚函数)或者基类的虚函数也实现了。
如果基类有纯虚函数,则派生类中必须实现它
class Tool { public: virtual void eat() = 0; // 这是个抽象类,如果没有实现,就叫纯虚函数,派生类必须实现。 };
#pragma once #include "Tool.h" class Dog:public Tool{ // 继承的意义:表示Dog类具有Tool类里面函数的功能 public: virtual void eat(); // 继承抽象类的子类需要实现这个函数才能实例化子类
};
#include "Dog.h" #include <iostream> using namespace std; void Dog::eat() { // 继承抽象类的子类需要实现这个函数才能实例化子类
cout << "eat" << endl; }
int main() { Tool *d = new Dog(); // 这是基类指针指向派生类对象。如果没有virtual,则调用基类的函数,若有则调用派生类的(加上virtual能多态,不加virtual只祖宗)。不能是:Tool *d = new Tool();,只能new"Tool"以下的类,如 Dog *d = new Dog();也行
d->eat(); delete d; d = NULL; system("pause"); return 0; }
虚函数注意:
- 在基类用virtual声明成员函数为虚函数。
这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。在类外定义虚函数时,不必再加virtual。 - 在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。因此在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。