类中的成员函数分为静态成员函数和非静态成员函数,而非静态成员函数又分为普通函数和虚函数。
至于为什么虚函数必须是非静态成员函数,可以看一下:http://blog.csdn.net/leiming32/article/details/8619893
我们在类中定义函数的时候,在前面加上virtual就可以声明为虚函数。
接下来我们看一个例子:
#include<iostream>
#include<string>
using namespace std;
class Student
{public:Student(string n,string nam,int sco);virtual void display();protected:string num;string name;int score;
};
Student::Student(string n,string nam,int sco)
{num=n;name=nam;score=sco;
}
void Student::display()
{cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"score:"<<score<<endl;
}
class Graduate:public Student
{public:Graduate(string n,string nam,int sco,string un);virtual void display();private:string university;
};
Graduate::Graduate(string n,string nam,int sco,string un):Student(n,nam,sco),university(un){};
void Graduate::display()
{cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"score:"<<score<<endl;cout<<"university:"<<university<<endl;
}
int main()
{Student *p;p=new Student("001","QianShou",100);p->display();cout<<"==============没有节操的分割线================"<<endl;p=new Graduate("001","QianShou",100,"SDNU");p->display();return 0;
}
运行结果:
/*num:001name:QianShouscore:100==============没有节操的分割线================num:001name:QianShouscore:100university:SDNU
*/
这就难免出现一个问题,我们为什么要用指向基类的指针指向派生类,然后再通过指针调用派生类中的成员函数呢?
为什么不直接建立一个指向派生类的指针,然后调用成员函数呢?这样都没有必要在基类中声明虚函数了。
我们考虑这样一个问题,如果我们要去一个城市的好多不同的地方,如果我们乘坐公交车的话,每去一个地方就需要选择不同的公交车;而如果我们乘坐出租车的话,我们只需要找一个出租车,然后不断告诉它不同的地点,它就能够带我们去不同的地方。
道理是相似的:
乘坐公交车:
假如一个基类有20个派生类,当我们分别访问这21个派生类和基类的时候,我们就需要为每一个类建立一个指针,然后通过不同的指针去访问不同的类的对象,就好像我们通过乘坐不同的公交车到达不同的地点一样。
乘坐出租车:
如果我们在基类中建立相应的虚函数,我们就只需要建立一个指向基类的指针。当我们需要访问该基类或者它的20个派生类的时候,我们只需将相应的类的地址赋给指向基类的指针,即可访问该派生类中的虚函数。就像我们在做出租车的时候,不断告诉司机我们的下一个地址一样。