虚函数的使用方法

来源:互联网 发布:帮我下载淘宝网 编辑:程序博客网 时间:2024/06/05 00:19
(1)在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便被调用。
在类外定义虚函数时,不必在定义virtual

 (2)在派生类中重新定义此函数,要求函数名,函数类型,函数参数个数和类型全部与基类的虚函数相同,并根据派

生类的需要重新定义函数体。

c++规定,当一个成员函数被声明为虚函数后,其派生类的同名函数都自动成为虚函数。因此在派生类重新声明该

虚函数时,可以加virtual,也可以不加,但习惯上一般在每层声明该函数时都加上virtual,使程序更加清晰。

如果再派生类中没有对基类的虚函数重新定义,则派生类简单的继承起基类的虚函数。 

 (3)定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。

 (4)通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。


下面来看一个例子:

[cpp] view plain copy
  1. #include<iostream>  
  2. #include<string>  
  3.   
  4. using namespace std;  
  5.   
  6. class Student  
  7. {  
  8.     public:  
  9.         Student(int , string, float);  
  10.         void display();  
  11.     protected:  
  12.         int num;  
  13.         string name;  
  14.         float score;      
  15. };  
  16. Student::Student(int n, string na, float s)  
  17. {  
  18.     num=n;  
  19.     name=na;  
  20.     score=s;  
  21. }  
  22. void Student::display()  
  23. {  
  24.     cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<endl;  
  25. }  
  26. class Graduate:public Student  
  27. {  
  28.     public:  
  29.             Graduate(int , string , floatfloat);  
  30.             void display();  
  31.   
  32.     private:  
  33.             float pay;  
  34.       
  35. };  
  36. Graduate::Graduate(int n, string na, float s, float p):Student(n,na,s),pay(p)  
  37. {  
  38. }  
  39. void Graduate::display()  
  40. {  
  41.     cout<<"num:"<<num<<"\nname:"<<name<<"\nscore:"<<score<<"\npay:"<<pay<<endl;  
  42.  }  
  43.    
  44. int main()  
  45. {  
  46.     Student stud1(110,"SDL",99.8);  
  47.     Graduate grad1(120,"CCT",88.9, 250.5);  
  48.       
  49.     Student *p;  
  50.       
  51.     p=&stud1;  
  52.     cout<<"student:"<<endl;  
  53.     p->display();  
  54.     p=&grad1;  
  55.     cout<<"graduate:"<<endl;  
  56.     p->display();  
  57.       
  58.     return 0;  
  59. }   
输出的结果为:


此时没有将任何函数声明为虚函数,所以在Graduate类中diaplay()函数输出时没有pay的值,以为p指针是Student类的,本身Student不包括pay数据。

但如果我们想输出pay的值,只要把Student类中的display函数声明为虚函数即可,只要把它改为virtual void display()声明为虚函数就行,输出的结果为:

0 0
原创粉丝点击