1. 多态基础概念解析
多态是面向对象编程三大特性之一(封装、继承、多态),它允许我们使用统一的接口处理不同类型的对象。想象你是一个动物园管理员,当你说"动物们开始表演"时,狮子会吼叫,猴子会翻跟头,鹦鹉会说话——这就是现实中的多态。
在C++中实现多态需要三个必要条件:
- 存在继承关系的类层次结构
- 基类中声明虚函数
- 使用基类指针或引用调用派生类对象
cpp复制class Animal {
public:
virtual void makeSound() {
cout << "Some animal sound" << endl;
}
};
class Lion : public Animal {
public:
void makeSound() override {
cout << "Roar!" << endl;
}
};
class Monkey : public Animal {
public:
void makeSound() override {
cout << "Ooh ooh ah ah!" << endl;
}
};
int main() {
Animal* animals[] = {new Lion(), new Monkey()};
for(auto animal : animals) {
animal->makeSound(); // 不同表现
}
}
关键理解:多态的核心价值在于"接口统一,实现各异"。这让代码更灵活,新增派生类时无需修改现有调用代码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 虚函数深度剖析
2.1 虚函数声明与使用
虚函数通过在基类函数声明前添加virtual关键字实现。当派生类重写虚函数时,建议添加override关键字(C++11引入),这能让编译器帮助检查是否正确重写。
cpp复制class Shape {
public:
virtual void draw() { // 基类虚函数
cout << "Drawing a shape" << endl;
}
virtual double area() const = 0; // 纯虚函数
};
class Circle : public Shape {
public:
void draw() override { // 明确表示重写
cout << "Drawing a circle" << endl;
}
double area() const override {
return 3.14159 * radius * radius;
}
private:
double radius = 1.0;
};
2.2 虚函数表机制
每个包含虚函数的类都有一个虚函数表(vtable),表中存放该类虚函数的地址。对象内部包含一个指向vtable的指针(vptr)。调用虚函数时:
- 通过对象的vptr找到vtable
- 在vt
