C++ 多态底层实现机制深度解析
在掌握虚函数、重写、纯虚函数等语法概念后,很多开发者仍对多态的底层运作感到困惑:为什么带虚函数的类 sizeof 会变大?基类指针如何找到派生类的函数?虚表究竟存在哪里?本文从内存布局、对象模型及汇编视角,彻底剖析 C++ 多态的实现原理。
一、虚函数与普通函数的区别
通过一个简单的测试可以观察虚函数带来的内存变化:
#include <iostream>
using namespace std;
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;
}
对于普通类,成员变量占用的空间经对齐后通常为 8 字节(1+5)。但上述代码运行结果为 12。这是因为编译器在含有虚函数的类对象中插入了一个隐藏的指针,称为虚函数表指针(vptr)。每个包含虚函数的类对象至少拥有一个 vptr,它指向该类的虚函数表(vtable)。
二、多态的实现原理
1. 动态绑定机制
当满足多态条件(基类指针/引用 + 调用虚函数)时,程序不再在编译期确定函数地址,而是在运行时通过对象的 vptr 查找虚表中对应的函数地址。
class Person {
public:
virtual void BuyTicket() { cout << "买票 - 全价" << endl; }
private:
string _name;
};
class Student : public Person {
:
{ cout << << endl; }
:
string _id;
};
: Person {
:
{ cout << << endl; }
:
string _codename;
};
{
ptr->();
}
{
Person ps;
Student st;
Soldier sr;
(&ps);
(&st);
(&sr);
;
}


