我:虚函数是C++实现多态的一种方式,基类的函数被声明为virtual后,派生类可以根据需要重写基类中的虚函数,实现同一调用方式实现不同效果。如果基类中的函数被声明为纯虚函数,该基类就变成一个抽象类,则派生类必须重写该纯虚函数。
书本解释:
C++在调用函数的时候,会把该调用与合适的函数定义相匹配,这种匹配发生在编译器,也称为静态绑定。
也可以告诉编译器,把函数调用与函数定义之间的匹配放到运行期去做,称为动态绑定。
如果使用了virtual,则编译器会对该函数做动态绑定。
静态绑定:
#include <iostream>
using namespace std;
class A
{
public:
void f()
{
cout<<"Base class A"<<endl;
}
};
class B :public A
{
public:
void f()
{
cout<<"Class B"<<endl;
}
};
void g(A &arg)
{
arg.f();
}
int main()
{
B x;
g(x);//g函数的参数是A类,传入的是B类
return 0;
}
执行函数g()时,虽然其参数所指的对象是B类型,但实际被调用的却是A类里的f();
因为编译器在编译期只知道g()函数的参数所引用的那个对象其类型派生自A类,但是它并不清楚这个类型究竟是A还是B。
动态绑定:
把A类中的void f()函数加上virtual声明
那么函数就会调用到B类的f();在运行期确定要调用的函数,可以明确的知道参数是B类。