理解C++多态(新手友好版)

理解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. 多态三要素

  1. 继承关系(Dog继承Animal)
  2. 虚函数(virtual修饰)
  3. 父类指针/引用指向子类对象

三、多态的工作原理

编译器悄悄做了这些事:

  1. 创建虚函数表(vtable)记录实际要调用的函数
  2. 对象中存储指向虚函数表的指针(vptr)
  3. 调用时通过vptr找到正确的函数

(新手暂时不需要深究这个机制,知道它存在即可)

四、什么时候使用多态?

  1. 需要统一处理不同子类对象时
void animalConcert(Animal* animals[], int count) {
    for(int i=0; i<count; i++){
        animals[i]->makeSound();
    }
}
  1. 扩展代码时不需要修改原有逻辑
// 新增鸭子类
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、父类指针/引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值