在 C++ 中,多态是面向对象编程的核心特性之一。虽然语法层面我们熟悉虚函数、重写和纯虚函数,但真正理解其底层机制——虚指针(vptr)与虚函数表(vtable)的协作,对于掌握对象模型至关重要。
一、虚函数与普通函数的区别
我们可以通过一个简单的内存大小测试来观察虚函数的影响。考虑以下代码:
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;
}
正常情况下,类成员变量 int (4 字节) + char (1 字节) 经过内存对齐后应为 8 字节。但实际运行结果是 12 字节。为什么会多出 4 字节?
这是因为含有虚函数的类,编译器会在对象内部隐式添加一个指向虚函数表的指针,即 虚函数表指针(vptr)。32 位系统下该指针占 4 字节,64 位系统下占 8 字节。这个指针使得每个对象都能找到对应的虚函数表。

二、多态的实现原理
动态绑定与静态绑定
当通过基类指针或引用调用虚函数时,程序不会在编译期确定调用哪个函数,而是运行时根据对象实际类型查找虚表。这就是 动态绑定。反之,非虚函数调用则是 静态绑定。
看下面的示例:
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
private:
string _name;
};
: Person {
:
{
cout << << endl;
}
:
string _id;
};
: Person {
:
{
cout << << endl;
}
:
string _codename;
};
{
ptr->();
}
{
Person ps;
Student st;
Soldier sr;
(&ps);
(&st);
(&sr);
;
}





