前言
在 C++ 多态的语法层面,我们已经认识了虚函数、重写、纯虚函数等关键知识点。多态的底层依赖于 vptr(虚指针)与 vtable(虚函数表)。但在学习时,常有以下疑问:
- 为什么带虚函数的类,sizeof 大小会多出 4/8 字节?
- 基类指针指向不同派生类对象,是如何在运行时找到对应函数的?
- 虚表、虚指针、虚函数分别存在内存哪个区域?
- 静态绑定和动态绑定到底有什么区别?
本篇从内存布局、对象模型、汇编视角、虚表结构出发,把 C++ 多态的底层原理彻底讲透。
正文
一、虚函数与普通函数的区别
下面我们通过一道题来阐明这个问题:
下面编译为 32 位程序的运行结果是什么? A. 编译报错 B. 运行报错 C. 8 D. 12
class Base {
public:
virtual void Func1() { cout << "Func1()" << endl; }
protected:
int _b = 1;
char _ch = 'x';
};
int main() {
Base b;
cout << sizeof(b) << endl;
return 0;
}
正常对于一个类来说,其成员函数所占内存总和再内存对齐之后就是其类内存大小。我们试着来看一下这个带虚函数类的内存大小:
12
正常来说是 1+5 然后内存对齐为 8,可是其运行结果是 12,为什么会这样呢?
监视窗口调试一下:

咦?这个 _vfptr 是什么东西?没错,像是上方提到的,对象中的这个指针我们叫做虚函数表指针(v 代表 virtual,f 代表 function)。一个含有虚函数的类中至少都有一个虚函数表指针,因为一个类所有虚函数的地址要被放到这个类对象的虚函数表中,虚函数表也简称虚表。
二、多态的原理
多态是如何实现的







