如何在 C++ 中实现多态?

一句话总结

父类写 virtual,子类重写,用父类指针/引用调用子类对象。


一、实现多态的 4 个必须条件

  1. 必须有继承关系(子类继承父类)
  2. 父类中必须将函数声明为 virtual(虚函数)
  3. 子类必须重写(override)这个虚函数
  4. 必须用 父类指针 / 父类引用 指向子类对象 调用函数

满足这 4 条,运行时就会自动调用子类版本 → 这就是多态


二、最简代码示例(一看就懂)

cpp 复制代码
#include <iostream>
using namespace std;

// 1. 父类
class Animal {
public:
    // 2. 父类写 virtual
    virtual void speak() {
        cout << "动物叫" << endl;
    }
};

// 3. 子类继承
class Dog : public Animal {
public:
    // 4. 子类重写虚函数
    void speak() override {
        cout << "汪汪汪" << endl;
    }
};

class Cat : public Animal {
public:
    void speak() override {
        cout << "喵喵喵" << endl;
    }
};

// 测试:父类指针指向不同子类
int main() {
    Animal* p1 = new Dog();
    Animal* p2 = new Cat();

    p1->speak(); // 输出 汪汪汪
    p2->speak(); // 输出 喵喵喵

    return 0;
}

运行结果:

复制代码
汪汪汪
喵喵喵

同一个指针类型,调用同一个函数,执行不同逻辑 → 这就是多态。


三、最关键的 3 个考点(面试必问)

1. 为什么要加 virtual?

不加 virtual → 编译期确定函数地址(静态绑定)

加 virtual → 运行期查找函数地址(动态绑定)

2. 什么是重写(override)?

  • 函数名、参数、返回值 完全一样
  • 父类必须是虚函数

3. 析构函数为什么要写成 virtual?

如果父类指针指向子类对象,delete 时

  • 析构不是 virtual → 只调用父类析构,内存泄漏
  • 析构是 virtual → 先调用子类析构,再调用父类

正确写法:

cpp 复制代码
virtual ~Animal() {}

四、最精炼背诵版(面试直接说)

  1. 建立继承关系
  2. 父类提供虚函数
  3. 子类重写虚函数
  4. 父类指针或引用指向子类对象,调用同名函数
相关推荐
码匠许师傅14 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
闻道且行之15 小时前
图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透
数据库·c++·人工智能·opencv
学习星球15 小时前
Solid.js 实战:拆解官方 RealWorld 项目
开发语言·javascript·vue.js
OPEN-F15 小时前
Python进阶教程:正则表达式进阶与文本处理
开发语言·python·正则表达式
zhifou12345615 小时前
java 17升级安装
java·开发语言
莫浅子15 小时前
day01-USB架构与枚举
c++·单片机·嵌入式驱动
for_ever_love__15 小时前
python基础语法学习: 面向对象的三大特性
开发语言·python·学习
不会代码的小猴16 小时前
7. JSON
开发语言·c++·笔记·qt·算法·json
沫璃染墨16 小时前
《Qt从零入门系列(六):信号与槽进阶——从多种连接方式到Lambda表达式》
开发语言·c++·qt·代码规范·设计规范·qt5
ZJU_统一阿萨姆17 小时前
【算子开发】环境搭建与第一个CUDA程序
开发语言·人工智能·系统架构