1. C++多态的本质与实现机制
多态是面向对象编程中最强大的特性之一,它让代码具备了"以不变应万变"的能力。想象你是一个餐厅经理,当你说"准备餐点"时,中餐厨师会开始炒菜,西餐厨师会开始煎牛排——这就是多态在现实生活中的体现。
1.1 静态多态:编译时的决策艺术
函数重载是最常见的静态多态形式。编译器通过函数签名(函数名+参数列表)来区分不同的重载版本。这里有个专业技巧:返回类型不参与重载决议。也就是说,下面这两个函数声明会产生冲突:
cpp复制int process(int x);
double process(int x); // 错误!与上一个函数冲突
运算符重载则让自定义类型也能使用直观的运算符语法。比如为自定义的Vector类重载+运算符:
cpp复制Vector operator+(const Vector& v1, const Vector& v2) {
return Vector(v1.x + v2.x, v1.y + v2.y);
}
重要提示:过度使用运算符重载会导致代码可读性下降。除非语义非常明确(如数学运算),否则建议使用普通成员函数。
1.2 动态多态:运行时的魔法
虚函数机制是C++动态多态的核心。当基类指针指向派生类对象时,通过虚函数表(vtable)实现正确的方法调用。这个机制包含三个关键部分:
- 虚函数表:每个包含虚函数的类都有一个隐藏的vtable
- 虚指针(vptr):每个对象实例包含指向其类vtable的指针
- 动态绑定:运行时通过vptr查找vtable确定调用哪个函数
cpp复制class Animal {
public:
virtual void speak() { cout << "Animal sound" << endl; }
};
class Dog : public Animal {
public:
void speak() override { cout << "Woof!" << endl; }
};
Animal* pet = new Dog();
pet->speak(); // 输出"Woof!",而不是"Animal sound"
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
