如何在 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. 父类指针或引用指向子类对象,调用同名函数
相关推荐
clint4563 天前
C++进阶(1)——前景提要
c++
夜悊3 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴3 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0013 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
LDR0063 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术3 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园3 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob3 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享3 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.3 天前
C语言--day30
c语言·开发语言