1. 什么是虚函数(virtual)?
在C++语言中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对待,对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数。
简单的说,virtual是用来解决基类与派生类函数重名的问题, 当不使用虚函数时,调用的是基类定义的函数,使用虚函数时,则调用的是派生类定义的函数。
举一个简单的例子:
#include <iostream>
using namespace std;
class Parent
{
public:
void Function1()
{
printf("This is parent,function1\n");
}
virtual void Function2()
{
printf("This is parent,function2\n");
}
}parent;
class Child:public Parent
{
void Function1()
{
printf("This is child,function1\n");
}
void Function2() override
{
printf("This is child,function2\n");
}
}child;
int main(int argc, char* argv[])
{
Child child;
child.Function1();
child.Function2();
}
输出结果:
This is parent,function1
This is child,function2
其中 function1 没有使用virtual, function2 使用了virtual
当使用基类的指针或引用调用虚函数时,会发生动态绑定,即该指针或引用可能绑定一个基类对象,也可能绑定一个派生类对象,这在函数运行的时候才能得知。如果绑定的是基类对象,则调用的是基类中的虚函数,如果绑定的是派生类对象,则调用的是派生类中的虚函数。