如何在 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. 父类指针或引用指向子类对象,调用同名函数
相关推荐
我不是懒洋洋42 分钟前
从零实现一个分布式计算:MapReduce的核心设计
c++
微学AI9 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡10 小时前
算法日记 - Day3
java·开发语言·算法
韭菜炒鸡肝天10 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
小王C语言10 小时前
【7. 实现登录注册模块】:实现会话管理、注册/登录/退出 API
网络·c++
Aaron - Wistron11 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
Dxy123931021612 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
05664612 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄12 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰13 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#