C++中的虚函数用于实现C++的多态。
虚函数的定义:
虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是public(可以定义为private or proteceted, 但是对于多态来说,没有意义。),在基类的类定义中定义虚函数的一般形式:
virtual 函数返回值类型 虚函数名(形参表)
{ 函数体 }
在定义了的虚函数的派生类中如果重新写了这个基类虚函数的实现方式,那么当指向派生类这个重新实现的虚函数时,将使用派生类的实现方式运行;反之,如果并没有定义虚函数,而又在派生类中进行了重新实现基类的同名函数,当时用指针指向这个函数时,调用的仍将是基类的实现而非派生类的实现!
实例:
没有定义成虚函数的:
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
Student(int,string,float);
void display();
protected:
int num;
string name;
float score;
};
Student::Student(int n,string name,float s)
{
num = n;
this->name = name;
score = s;
}
void Student::display()
{
cout << "num : " << num << "name : " << name << "score : " << score << endl;
}
class Graduate:public Student
{
public :
Graduate(int,string,float,float);
void display();
private:
float pay;
};
void Graduate::display()
{
cout << "num : " << num << "name : " << name << "score : " << score << "pay = " << pay << endl;
}
Graduate::Graduate(int n , string name, float s, float p ) :Student(n,name,s),pay(p){}
int main()
{
Student stud1(1001,"Li",87.5);
Graduate grad1(2001,"Wang",98.7,343);
Student *pt = &stud1;
pt->display();
pt = &grad1;
pt->display();
return 0;
}
输出为:
num : 1001name : Liscore : 87.5
num : 2001name : Wangscore : 98.7
定义了虚函数的:
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
Student(int,string,float);
virtual void display();
protected:
int num;
string name;
float score;
};
Student::Student(int n,string name,float s)
{
num = n;
this->name = name;
score = s;
}
void Student::display()
{
cout << "num : " << num << "name : " << name << "score : " << score << endl;
}
class Graduate:public Student
{
public :
Graduate(int,string,float,float);
void display();
private:
float pay;
};
void Graduate::display()
{
cout << "num : " << num << "name : " << name << "score : " << score << "pay = " << pay << endl;
}
Graduate::Graduate(int n , string name, float s, float p ) :Student(n,name,s),pay(p){}
int main()
{
Student stud1(1001,"Li",87.5);
Graduate grad1(2001,"Wang",98.7,343);
Student *pt = &stud1;
pt->display();
pt = &grad1;
pt->display();
return 0;
}
输出为:
};
void Graduate::display()
{
cout << "num : " << num << "name : " << name << "score : " << score << "pay = " << pay << endl;
}
Graduate::Graduate(int n , string name, float s, float p ) :Student(n,name,s),pay(p){}
int main()
{
Student stud1(1001,"Li",87.5);
Graduate grad1(2001,"Wang",98.7,343);
Student *pt = &stud1;
pt->display();
pt = &grad1;
pt->display();
return 0;
}
输出为:
num : 1001name : Liscore : 87.5
num : 2001name : Wangscore : 98.7pay = 343
可以很明显看出区别:
在定义了虚函数的基类在派生类中实现重写时,通过指针能够调用到派生类的实现;而没有定义为虚函数的话,只能调用基类中的实现,不能调用派生类中的实现,即使已经重写了!!(见上面代码中的display())