当前位置: 首页 > news >正文

C++ 虚函数,虚析构函数与多态

先搞懂核心概念:多态(Polymorphism)

 
你可以把多态理解成:同一个行为,作用在不同对象上,表现出不同的效果
 
比如 “动物叫” 这个行为,猫叫是 “喵”,狗叫是 “汪”,用代码实现时,不用为每种动物写单独的调用逻辑,统一调用 “叫” 的方法,就能自动适配不同动物 —— 这就是多态的核心价值。
 
虚函数(virtual 函数) 是实现多态的 “开关”,虚析构函数 是多态场景下避免内存泄漏的 “补丁”。
 

 

一、虚函数:实现多态的核心

 

1. 什么是虚函数?

 
在基类的函数前加 virtual 关键字,这个函数就成了虚函数。它的作用是:告诉编译器,这个函数要 “晚绑定”(运行时才确定调用哪个版本),而不是 “早绑定”(编译时就确定)
 

2. 没有虚函数,就没有多态(反面例子)

 
cpp
 
运行
 
#include <iostream>
using namespace std;// 基类:动物
class Animal {
public:// 普通函数,没有virtualvoid makeSound() {cout << "未知动物叫" << endl;}
};// 派生类:猫
class Cat : public Animal {
public:void makeSound() { // 重写基类函数cout << "喵~" << endl;}
};// 派生类:狗
class Dog : public Animal {
public:void makeSound() { // 重写基类函数cout << "汪!" << endl;}
};int main() {Animal* a1 = new Cat(); // 基类指针指向派生类对象Animal* a2 = new Dog();a1->makeSound(); // 输出:未知动物叫(编译时绑定,只认基类)a2->makeSound(); // 输出:未知动物叫return 0;
}
 
 
问题:基类指针指向派生类对象时,调用的还是基类的函数,没法实现 “不同动物不同叫声”—— 这就是没有虚函数的问题。
 

3. 加虚函数,实现多态(正确例子)

 
只需要给基类的 makeSound()virtual
 
cpp
 
运行
class Animal {
public:// 虚函数:开启多态virtual void makeSound() {cout << "未知动物叫" << endl;}
};// 派生类代码不变
int main() {Animal* a1 = new Cat();Animal* a2 = new Dog();a1->makeSound(); // 输出:喵~(运行时绑定,认实际指向的对象)a2->makeSound(); // 输出:汪!delete a1;delete a2;return 0;
}
 
 
关键virtual 让函数调用从 “编译时确定” 变成 “运行时确定”,基类指针 / 引用会根据实际指向的派生类对象,调用对应的重写函数 —— 这就是动态多态
 

 

二、虚析构函数:多态场景下避免内存泄漏

 

1. 为什么需要虚析构函数?

 
当用基类指针指向派生类对象,并且派生类有自己的成员变量(需要析构)时,如果基类析构函数不是虚函数,删除基类指针只会调用基类的析构函数,派生类的析构函数不会被调用 —— 导致内存泄漏。
 

2. 反面例子(非虚析构函数)

 
cpp
 
运行
#include <iostream>
using namespace std;class Animal {
public:virtual void makeSound() { cout << "未知动物叫" << endl; }// 普通析构函数,没有virtual~Animal() { cout << "Animal析构" << endl; }
};class Cat : public Animal {
private:int* data = new int(10); // 动态分配内存
public:void makeSound() { cout << "喵~" << endl; }// 派生类析构函数:释放data~Cat() {delete data;cout << "Cat析构(释放data)" << endl;}
};int main() {Animal* a = new Cat();a->makeSound(); // 正常输出:喵~delete a; // 删除基类指针return 0;
}
 
 
输出结果
 
plaintext
 
喵~
Animal析构
 
 
问题Cat 的析构函数没被调用,data 指向的内存没释放 —— 内存泄漏!
 

3. 加虚析构函数(正确做法)

 
只需要给基类的析构函数加 virtual
 
cpp
 
运行
class Animal {
public:virtual void makeSound() { cout << "未知动物叫" << endl; }// 虚析构函数virtual ~Animal() { cout << "Animal析构" << endl; }
};
 
 
输出结果
 
plaintext
喵~
Cat析构(释放data)
Animal析构
 
 
关键:虚析构函数会让 delete 基类指针 时,先调用派生类的析构函数,再调用基类的 —— 保证所有资源都被释放。
 
🌟 小技巧:如果一个类是基类,并且可能被继承、用多态方式使用,建议直接把析构函数设为虚函数,哪怕暂时没有派生类。
 
 

 

三、核心规则总结

 
  1. 虚函数:基类函数加 virtual,派生类重写该函数,通过基类指针 / 引用调用时,会执行实际对象的函数版本 —— 实现动态多态。
  2. 虚析构函数:基类析构函数加 virtual,保证用基类指针删除派生类对象时,派生类析构函数会被调用,避免内存泄漏。
  3. 多态的前提:① 继承关系;② 基类有虚函数;③ 派生类重写虚函数;④ 通过基类指针 / 引用调用函数。
 

 

总结

 
  • 虚函数是多态的 “开关”:没有它,多态就无法实现,基类指针只能调用基类自己的函数;
  • 虚析构函数是多态的 “兜底保障”:没有它,派生类的资源会泄漏,是多态场景下的必做优化;
  • 多态的本质:通过虚函数表(vtable)实现运行时函数绑定,让代码更灵活、易扩展(比如新增 “鸟” 类,不用改原有调用逻辑)。
http://www.jsqmd.com/news/204425/

相关文章:

  • 测试左移2.0:构建产品设计阶段的质量防御体系
  • HMMT25难度分级解读:VibeThinker在各子任务上的表现拆解
  • 自动化测评 pipeline 搭建:基于VibeThinker的CI/CD扩展
  • 玩转DOM:像玩乐高一样操作网页元素
  • 微信小程序-路线规划/导航保姆版
  • 数据化浪潮下的科技成果转化:知识图谱如何重塑创新生态
  • 2026年宁波丙级办公楼出租信息推荐,低门槛办公楼招商优质企业年度排名全解析 - 工业品牌热点
  • 数据化浪潮下的技术转移革新:知识图谱如何重塑创新生态
  • SaaS 和 MaaS
  • 2026年深圳办公室出租指南:盘点五大产业园区,聚焦科技孵化与企业成长 - 品牌2026
  • 为什么你的 RAG 系统在复杂问题上失灵?
  • 微信小程序开发公司怎么选?避开低价陷阱的5大关键指标 课程小程序/硬件小程序/微信小程序开发公司推荐 - 品牌2026
  • 2026武汉防火门定制公司TOP5推荐:靠谱源头厂家选哪家? - 工业设备
  • 2025年度哪个有实力的高品质无负压变频供水设备厂家产品品质质量好 - 品牌推荐大师
  • Docker镜像源配置错误导致拉取失败?这份VibeThinker镜像清单请收好
  • 2026年 柱塞泵厂家权威推荐榜:高压/液压/气动/电动/小型/超高压/往复式柱塞泵,柱塞/三柱塞/柱塞式高压泵实力品牌深度解析 - 品牌企业推荐师(官方)
  • 【Docker与Git协同工作树配置秘籍】:掌握高效开发环境搭建的5大核心步骤
  • ubuntu22.04安装harbor
  • 哈尔滨汽车贴膜找哪家?汽车防爆膜贴膜口碑好合适公司推荐排名 - 工业品网
  • 2026杭州本地物业公司怎么选?专业物业管理公司服务项目及口碑对比 - 栗子测评
  • 2026年赣州热门装修公司推荐:赣州水木居装饰售后服务好吗 - 工业品牌热点
  • 如何在 Amazon Linux 2 服务器上部署并优化 Docker 容器,简化 CI/CD 流程并提升开发效率
  • static的注意事项
  • 垂直农场LED光照控制算法的节能测试框架与实践——面向软件测试工程师的技术解析
  • VS Code 最新版本下载安装,中文设置,微软免费轻量代码编辑器 新手必备
  • 理发店洗头床厂家直销哪家值得选?美发店发廊专用洗头床哪家好?2026年靠谱洗头床直销厂家全攻略 - 栗子测评
  • Baidu PaddlePaddle模型部署:VibeThinker生成Serving服务脚本
  • Airflow DAG编排:VibeThinker定义任务依赖关系图
  • 2025年耐候钢板供应商推荐榜:耐候钢/耐候钢板/耐候钢园林景观/耐候钢锈钢板/耐候钢耐腐蚀钢/耐候钢板光伏支架源头厂家精选 - 品牌推荐官
  • 深度测评专科生必备8款AI论文写作软件TOP8