1. C++多态的本质与实现原理
在C++中,多态是面向对象编程的三大特性之一(封装、继承、多态)。它允许我们通过统一的接口操作不同类型的对象,极大地提高了代码的灵活性和可扩展性。
1.1 静态多态与动态多态的区别
静态多态(编译期多态):
- 通过函数重载和运算符重载实现
- 在编译阶段确定函数调用
- 执行效率高但灵活性较低
动态多态(运行期多态):
- 通过虚函数和继承关系实现
- 在运行阶段确定函数调用
- 需要额外的运行时开销但灵活性高
实际开发中,90%以上的多态应用场景都是动态多态。静态多态更适合性能敏感且类型确定的场景。
1.2 虚函数的工作原理
当类中包含虚函数时,编译器会为该类生成一个虚函数表(vtable),并在每个对象中添加一个指向该表的指针(vptr)。这个机制是实现动态多态的关键。
cpp复制class Base {
public:
virtual void func1() { /*...*/ }
virtual void func2() { /*...*/ }
void nonVirtualFunc() { /*...*/ }
};
class Derived : public Base {
public:
void func1() override { /*...*/ } // 重写基类虚函数
};
内存布局示例:
code复制Base对象:
+---------+
| vptr | --> Base的vtable [&Base::func1, &Base::func2]
| ... |
+---------+
Derived对象:
+---------+
| vptr | --> Derived的vtable [&Derived::func1, &Base::func2]
| ... |
+---------+
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态多态的完整实现流程
2.1 实现动态多态的三个必要条件
- 继承关系:必须存在类之间的继承层次
- 虚函数重写:派生类必须重写基类的虚函数
- 基类指针/引用:必须通过基类的指针或引用调用虚函数
cpp复制class Animal {
public:
virtual void speak() const {
std::cout << "Animal sound" << std::endl;
}
};
class Dog : public Animal {
public:
void speak() const override { // override关键字确保是重写
std::cout << "Woof!" << st
