虚函数的作用
- 允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予它新的功能,并且可以通过指向基类的指针指向同一类族中不同类的对象,从而调用其中的同名函数。由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应。
有时在基类中定义的非虚函数会在派生类中被重新定义, 如果用基类指针调用该成员函数, 则系统会调用对象中基类部分的成员函数; 如果用派生类指针调用该成员函数, 则系统会调用派生类对象中的成员函数, 这并不是多态性行为(使用的是不同类型的指针), 没有用到虚函数的功能。
 虚函数的使用方法
- 在基类用virtual声明成员函数为虚函数;这样就可以在派生类中重新定义此函数, 为它赋予新的功能, 并能被方便的调用。在类外定义虚函数时, 不必再加virtual;
- 在派生类中重新定义此函数, 要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同, 并根据派生类的需要重新定义函数体;
- 定义一个指向基类对象的指针变量, 并使它指向同一类族中需要调用该对象的函数;
- 通过该指针变量调用此虚函数, 此时调用的就是指针变量指向的对象的同名函数。通过虚函数与指向基类对象的指针变量的配合使用, 就能方便的调用同一类族中不同类的同名函数, 只要先用基类指针指向即可;
 示例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 
 | #include <iostream>#include <string>
 using namespace std;
 
 
 class Student {
 protected:
 int _num;
 string _name;
 double _score;
 public:
 Student(int num, string name, double score) : _num(num), _name(name), _score(score) {};
 virtual void display() {
 cout << "num: " << _num << " name: " << _name << " score: " << _score << endl;
 }
 };
 
 
 
 class Graduate : public Student {
 private:
 double _pay;
 public:
 Graduate(int num, string name, double score, double pay) : Student(num, name, score), _pay(pay) {};
 void display() {
 cout << "num: " << _num << " name: " << _name << " score: " << _score << " pay: " << _pay << endl;
 }
 };
 
 int main(void){
 Student st(1001, "Li", 55.8);
 Graduate gr(2001, "Wang", 87, 534.5);
 Student * p = &st;
 p->display();
 p = &gr;
 p->display();
 
 
 
 
 
 return 0;
 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 
版权声明: 此文章版权归金晖のBlog所有,如有转载,请注明来自原作者