在 C++ 中,对象本身只保存数据和一个隐藏的虚表指针(vptr),而所有成员函数的代码都只存在于程序的代码段中。 如果类有虚函数,编译器会为每个类生成一张虚表(vtable),虚表里存放对应虚函数的函数地址。 当创建
Derived对象时,对象内的vptr会指向Derived::vtable;如果用Base*指向这个对象并调用虚函数,程序会在运行时通过vptr → vtable → 函数地址,最终调用到Derived::f,这就是动态绑定。 如果是普通对象或按值传递(发生对象切片),就不会经过虚表,而是在编译期直接决定调用Base::f,这是静态绑定。 构造和析构过程中,vptr会随着当前构造层级切换,确保虚函数只调用'当前已构造完成'的那一层实现。
引言:为什么需要多态?
设想一个图形绘制系统:
class Shape {
public:
void draw() { /* 绘制基础形状 */ }
};
class Circle : public Shape {
public:
void draw() { /* 绘制圆形 */ }
};
class Rectangle : public Shape {
public:
void draw() { /* 绘制矩形 */ }
};
// 问题来了:如何统一处理?
{
( i = ; i < count; i++) {
shapes[i]->();
}
}


