多态可以分为两类:编译时的多态性和运行时的多态性。前者是通过静态联编来实现的,比如C++中通过函数的重载和运算符的重载。后者则是通过动态联编来实现的,在C++中运行时的多态性主要是通过虚函数来实现的。
虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
虚函数的作用是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数进行重新定义。在派生类重新定义的函数应与虚函数具有相同的形参个数和形参类型(参数类型的顺序也要一致),以实现统一的接口。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
在使用虚函数时应注意的几个方面:
1)在类体中使用关键字virtual将函数声明为虚函数,而定义时不需要使用关键字virtual。
2)基类中的某一函数声明为虚函数后,派生类中的同名函数自动成为虚函数。
3)如果声明了某个成员函数为虚函数,则该类中不能出现与这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现这种同名函数。
4)非类的成员函数不能定义为虚函数,全局函数以及类的成员函数中的静态成员函数和构造函数不能定义为虚函数,但可以将析构函数定义为虚函数。当基类的析构函数定义为虚函数之后,利用delete删除一个指向派生类定义的指针时,系统会调用相应的类的析构函数、而不将析构函数定义为虚函数时,只调用基类的析构函数。
5)基类的析构函数定义为虚函数后,这样可以在实现多态的时候不造成内存泄漏。基类未声明Virtual,基类指针指向派生类时,delete指针不调用派生类析构函数。有virtual,先调用派生类析构再调用基类析构。
虚函数含义是让一个函数具有不同的行为。
举例来说,人这个类有个函数叫工作!医生和交警分别继承自人,都具有了工作这个函数,当然医生的工作内容是治病,交警的工作内容是指挥交通。
现在你需要将交警和医生同等对待,归类为人,并分别调用其工作函数去执行工作。
如果工作这个函数不是虚函数,那你调用的就是人的工作函数,无任何意义!相反,如果是虚函数,那交警就会去指挥交通,医生会去治病!
http://c.biancheng.net/cpp/biancheng/view/244.html