1.虚函数怎么用?
虚函数必须是基类的非静态成员函数。
2.虚函数的作用?
虚函数的作用是在程序的运行阶段动态的选择合适的成员函数,在派生类中重新定义的函数与虚函数具有相同的形参个数和类型。
3.什么是动态编联?
虚函数的作用也可以说是实现动态编联。动态编联是通过基类的指针与虚函数的结合实现多态性的。先定义一个指向想赢得类对象,然后通过这个基类指针去调用虚函数。显然,对这样的调用方式,编译系统在编译该行时是无法确定调用哪一个类对象的虚函数的。这时编译系统把它放在运行阶段处理,在运行阶段确定关联关系系。因为是在运行阶段把虚函数和类对象“绑定”的,所以这个过程称为动态编联。
4.动态编联的规定:
动态编联规定,只能通过指向基类的指针或基类对象的引用来调用虚函数。
5.虚函数的一个简单的例子:
#include<iostream>
using namespace std; class animal { protected: char sex; public: virtual void soar(){}; virtual void eat(){}; };class tiger:public animal
{ public: tiger(char s='f'){sex=s;} void soar(){cout<<"tiger hou!"<<endl;} void eat(){cout<<"tiger ear!"<<endl;} };class sheep:public animal
{ public: sheep(char s='f'){sex=s;} void soar(){cout<<"sheep:mie!"<<endl;} void eat(){cout<<"sheep eat grass!"<<endl;} };int main()
{ tiger t1,t2; sheep s1,s2; animal *array[4]={&t1,&s1,&t2,&s2}; for(int i=0;i<4;++i) { array[i]->eat(); array[i]->soar(); } system("pause"); }程序运行结果为:
而如果将animal类中不用虚函数,即:将两个virtual去掉,则程序运行结果为:
可见,虚函数可以使我们在用指向基类的指针访问函数时,选择我们想要访问的函数(当然,这要求我们把指针指向相应的继承类对象)。
6.声明基类的函数为纯虚函数则后面继承类应该对函数做定义,否则会报错。
拿上面的例子举例:如果将virtual void eat(){};改为virtual void eat()=0;而后面如果不再对eat()函数定义,则会报错。
应该与不改动时加以区别。如果上面的程序不改动,而将对eat()的定义注释掉,则不会报错,因为{}也相当于执行了,只是语句为空而已。