1. 多态的本质与实现机制
在C++中,多态性是通过虚函数表(vtable)和虚指针(vptr)的机制实现的。每个包含虚函数的类都会有一个对应的虚函数表,表中存放着该类所有虚函数的地址。当创建该类的对象时,对象中会包含一个隐藏的虚指针,指向对应的虚函数表。
cpp复制class Base {
public:
virtual void func1() { cout << "Base::func1" << endl; }
virtual void func2() { cout << "Base::func2" << endl; }
int baseData;
};
class Derived : public Base {
public:
void func1() override { cout << "Derived::func1" << endl; }
virtual void func3() { cout << "Derived::func3" << endl; }
int derivedData;
};
对于上述代码,内存布局大致如下:
code复制Base类对象:
+----------------+
| vptr | -> 指向Base的虚函数表
+----------------+
| baseData |
+----------------+
Base的虚函数表:
+----------------+
| &Base::func1 |
+----------------+
| &Base::func2 |
+----------------+
Derived类对象:
+----------------+
| vptr | -> 指向Derived的虚函数表
+----------------+
| baseData |
+----------------+
| derivedData |
+----------------+
Derived的虚函数表:
+----------------+
| &Derived::func1| // 重写的func1
+----------------+
| &Base::func2 | // 继承的func2
+----------------+
| &Derived::func3| // 新增的func3
+----------------+
1.1 动态绑定的实现原理
当通过基类指针或引用调用虚函数时,编译器会生成代码通过虚指针查找虚函数表,然后调用表中对应的函数。这个过程是在运行时完成的,因此称为动态绑定。
cpp复制Base* pb = new Derived();
pb->func1(); // 调用Derived::func1
pb->func2(); // 调用Base::func2
// pb->func3(); // 错误:Base类中没有func3
注意:只有通过指针或引用调用虚函数时才会发生动态绑定。如果通过对象直接调用,则是静态绑定。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 多态的高级应用场景
2.1 纯虚函数与抽象类
纯虚函数是在基类中声明但没有定义的虚函数,通过在函数声明后加"=0"来指定:
cpp复制class Shape {
public:
virtual double area() const = 0; //
