前言
在 googletest
的源码中,看到gtest-matchers.h 中实现的MatcherBase
类自定义了一个 VTable
,这种设计实现了一种类似于C++虚函数的机制。C++中的虚函数机制实质上就是通过这种方式实现的,本文用c语言自定义虚函数表VTable实现了一下virtual的功能,来深刻理解其机制。我们通过创建存储函数指针的结构体来模拟这种行为。
C++的运行时多态
如果我们在C++中有一个抽象基类 Shape
,定义了纯虚函数GetArea()
用于计算面积。对于不同的派生于 Shape
的类,面积计算方法会不一样。比如,对于圆形 Circle
类,是 Shape
的一种,其特有属性为半径r,面积计算公式为 π·r²
;对于正方形 Square
类,其特有属性为边长d,其面积计算公式为 d²
。
基类Shape
的定义如下:
class Shape {
public:
virtual double GetArea()=0;
};
派生类Circle
继承于 Shape
,定义如下:
class Circle: public Shape {
public:
Circle(double r):radius(r){
}
double GetArea(