虚函数是父类提供给子类的一个函数接口,这不是实际存在的函数,在子类中可以重写该函数。声明虚函数的关键词是virtual,其实这是解决父类指针和子类指针交错的一种方法。如果用一个父类的指针想调用子类的方法是不行,因为父类的内存大小比子类的小,访问不了子类的方法。但虚函数就可以做到。
我们先看下不是虚函数的情况:
#include<iostream>
class Father
{
public:
Father()
{
std::cout << "from Father\n";
}
void show()
{
std::cout << "father\n";
}
~Father()
{
std::cout << "delete Father\n";
}
};
class Child :public Father
{
public:
Child()
{
std::cout << "from Child\n";
}
void show()//和父类的同名函数
{
std::cout << "child\n";
}
~Child()
{
std::cout << "delete Child\n";
}
};
void main()
{
Father f;
Father *pf;
pf = &f;
pf->show();//调用父类方法
Child c;
pf=&c;
pf->show();//想通过父类指针调用子类方法
system("pause");
}
用父类指针调用子类方法失败。
对程序作出以下修改:
virtual void show()//把父类的show函数定义为虚函数
{
std::cout << "father\n";
}
把父类的函数定义为虚函数后,父类指针可以调用子类的方法。这是虚函数最大的作用,通过父类提供的接口,在子类中多种实现。虚函数的使用的函数还支持在父类重载,但不能出现和虚函数同名、参数个数、类型一样的非虚函数。