我是网易的老高,欢迎大家关注我的专栏,我们很多时候都直接使用C++的虚函数来实现多态,那么你有没有想过他在运行时是如何查找到他要调用的函数呢? 这篇文章将打开你的疑问大门,并且通过C语言的方式来实现虚函数指针,虚函数表,让你用另外一个角度看虚函数表。

虚拟函数和派生类

C++编译器在构造这个vfptr、vtable以及调用类的虚拟函数时创建了大量抽象。为了理解这个虚拟函数是如何工作的,我们在下面的每个部分都用例子和C语言进行了说明。

在下面的例子中,我们有一个名为CShape的基类的例子。这是一个抽象基类。抽象基类或ABC是一个至少包含一个纯虚拟函数的类。

class CShape{public :CShape();virtual void Draw(void) = 0;}; 

现在,我们从CShape派生出了两种新的派生类,称为CCircle和CRectangle。

class CCircle : public CShape{protected :int x, y, r;public :CCircle(int x, int y, int r);virtual void Draw(void);};class CRectangle : public CShape{protected :int x, y, w, h;public :CRectangle(int x, int y, int w, int h);virtual void Draw(void);}; 

使用基类指针调用Virtual函数

在面向对象的环境中,我们总是使