详解C++编程中的虚函数

2020-01-06 13:45:07丽君

易采站长站为您分析详解C++编程中的虚函数,包括在什么情况下应当声明虚函数的相关讲解,需要的朋友可以参考下

我们知道,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。

人们提出这样的设想,能否用同一个调用形式,既能调用派生类又能调用基类的同名函数。在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们。例如,用同一个语句“pt->display( );”可以调用不同派生层次中的display函数,只需在调用前给指针变量 pt 赋以不同的值(使之指向不同的类对象)即可。

打个比方,你要去某一地方办事,如果乘坐公交车,必须事先确定目的地,然后乘坐能够到达目的地的公交车线路。如果改为乘出租车,就简单多了,不必查行车路线,因为出租车什么地方都能去,只要在上车后临时告诉司机要到哪里即可。如果想访问多个目的地,只要在到达一个目的地后再告诉司机下一个目的地即可,显然,“打的”要比乘公交车 方便。无论到什么地方去都可以乘同—辆出租车。这就是通过同一种形式能达到不同目的的例子。

C++中的虚函数就是用来解决这个问题的。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

请分析下面这个例子。这个例子开始时没有使用虚函数,然后再讨论使用虚函数的情况。

[例] 基类与派生类中有同名函数。在下面的程序中Student是基类,Graduate是派生类,它们都有display这个同名的函数。

 

 
  1. #include <iostream>  #include <string> 
  2. using namespace std;  //声明基类Student 
  3. class Student  { 
  4. public:  Student(int, string,float); //声明构造函数 
  5. void display( );//声明输出函数  protected: //受保护成员,派生类可以访问 
  6. int num;  string name; 
  7. float score;  }; 
  8. //Student类成员函数的实现  Student::Student(int n, string nam,float s)//定义构造函数 
  9. {  num=n; 
  10. name=nam;  score=s; 
  11. }  void Student::display( )//定义输出函数