理解C++多态(新手友好版)
今天我们要用"动物叫声"的例子,轻松理解C++中看似抽象的多态概念。
一、什么是多态?
想象你去动物园,看到:
- 小狗会"汪汪"
- 小猫会"喵喵"
- 小鸡会"咯咯"
虽然都是动物,但叫声不同。这就是多态——同一行为的不同表现方式。
二、C++中的多态实现
1. 基础版:没有多态的动物世界
class Animal {
public:
void makeSound() { cout << "动物叫" << endl; }
};
class Dog : public Animal {
public:
void makeSound() { cout << "汪汪!" << endl; }
};
int main() {
Animal* animal = new Dog();
animal->makeSound(); // 输出"动物叫" 😟
delete animal;
}
问题:即使创建的是小狗,仍然调用父类方法
2. 魔法时刻:加上virtual
class Animal {
public:
virtual void makeSound() { cout << "动物叫" << endl; } // ✨关键在这里
};
class Dog : public Animal {
public:
void makeSound() override { cout << "汪汪!" << endl; } // 建议加override
};
现在运行:
Animal* animal = new Dog();
animal->makeSound(); // 输出"汪汪!" 🎉
3. 多态三要素
- 继承关系(Dog继承Animal)
- 虚函数(virtual修饰)
- 父类指针/引用指向子类对象
三、多态的工作原理
编译器悄悄做了这些事:
- 创建虚函数表(vtable)记录实际要调用的函数
- 对象中存储指向虚函数表的指针(vptr)
- 调用时通过vptr找到正确的函数
(新手暂时不需要深究这个机制,知道它存在即可)
四、什么时候使用多态?
- 需要统一处理不同子类对象时
void animalConcert(Animal* animals[], int count) {
for(int i=0; i<count; i++){
animals[i]->makeSound();
}
}
- 扩展代码时不需要修改原有逻辑
// 新增鸭子类
class Duck : public Animal {
public:
void makeSound() override { cout << "嘎嘎!" << endl; }
};
// 原有concert函数无需修改就能处理鸭子
五、新手常见疑问
Q:为什么要用指针/引用?
A:对象切片问题——值传递会丢失子类信息
Q:所有函数都要virtual吗?
A:不需要!只有需要重写的函数才声明为virtual
Q:析构函数为什么要virtual?
A:确保正确释放资源(重要!)
class Animal {
public:
virtual ~Animal() {} // 虚析构函数
};
六、总结
多态就像变色龙:
- 统一接口(动物叫)
- 不同实现(各种叫声)
- 灵活扩展(新增动物不影响已有代码)
记住三个关键词:virtual、override、父类指针/引用
11万+

被折叠的 条评论
为什么被折叠?



