1,介绍
虚函数是定义在基类中的函数,子类必须对其进覆盖。在类中声明虚函数的格式: virtual void display();
2,作用
(1)定义子类对象,并调用对象中未被子类覆盖的基类函数A。同时在该函数A中,又调用了子类覆盖的基类函数B。此刻将会调用基类中的函数B, 而我们原本是想调用是子类中的覆盖函数B。 而使用虚函数就可以解决这个问题。
举个例:
#include<iostream>
using namespace std;
class Father{
void display() {cout<<"Father.dispaly() \n";}
void fatherShowDisplay(){display();
}
class Son:public father{
public:
void display(){cout<<"Son.dispaly() \n";}
}
int main(){
Son son;
son.fatherShowDisplay();
}
通过基类中未被覆盖的函数,来调用子类中被覆盖的display函数。
输出的结果是 Father.display() 。
修改方法: 将display() 变成虚函数。
#include<iostream>
using namespace std;
class Father //基类 Father
{
public:
virtual void display() {cout<<"Father::display()\n";}
//在函数中调用了,子类覆盖基类的函数display()
void fatherShowDisplay() {display();}
};
class Son:public Father //子类Son
{
public:
//重写基类中的display()函数
void display() {cout<<"Son::display()\n";}
};
int main()
{
Son son; //子类对象
son.fatherShowDisplay(); //通过基类中未被覆盖的函数,想调用子类中覆盖的display函数
}
输出结果:Son::display() 。
(2)在使用指向子类对象的基类指针,并调用子类中的覆盖函数时,如果该函数不是虚函数,那么将调用基类中的该函数;如果该函数是虚函数,则会调用子类中的该函数。
代码:
#include<iostream>
using namespace std;
class Father{
public:
void display(){cout<<"father.display()";}
};
class Son::Father{
public:
void display(){cout<<"son.display";}
};
main(){
Father *p ;
Son son;
p = &son;
p->display();
}
定义一个基类指针, 让它指向子类覆盖的函数,如果该函数没有使用virtual,输出的结果就是 father.dispaly