虚函数和虚函数表
在了解什么是虚函数之前,首先要理解什么是动态绑定。
动态绑定
- 动态绑定是C++类指针或引用的特性,当编译器遇到一个基类指针或引用时,并不直接确定其类型,而是在运行时根据其具体指向来调用对应的函数。
- 为什么基类指针和引用可以指向派生类呢?因为类的继承关系是一种is a的关系,即派生类是特殊的基类,因此基类指针和引用可以指向派生类,但是此时的基类指针和引用,只能访问基类的对象和成员函数。如果想要在不发生强制类型转换的情况下访问派生类的成员函数,就要用到虚函数的概念。
虚函数应用示例
- 虚函数的实现前提是,派生类和基类中存在同样的函数,名字和形参列表都一致,在基类中该函数有virtual关键字声明,派生类中无所谓。
- 于是当程序执行遇到基类指针或者引用时,先判断指向的类型,再根据类型调用相关的函数。注意:只要是基类指针指向的虚函数调用,均会实行动态绑定,容易忽略的一点是在基类的成员函数内部发生的调用,隐含了this指针,所以同样会发生动态绑定。可以观察以下代码,猜测其输出,然后和运行结果进行对比。
#include <iostream>
using namespace std;
class base
{
public:
virtual void display()
{
cout<<"I am base display\n";
}
void display(int i)
{
cout<<"base i="<<i<<endl;
}
void show()
{
cout<<"this is base show"<<endl;
display();
}
};
class derived: