C++学习日记 Day10:多态

发布时间:2026/10/1 16:02:02

C++学习日记 Day10:多态 ## 今天学了什么今天学习C的多态。## 多态的分类静态多态函数重载、运算符重载、模板复用函数名动态多态派生类和虚函数实现运行时。*注静态多态和静态函数/静态变量static没有关系只是相对于动态多态的叫法。①静态多态和动态多态的区别静态多态的函数地址早绑定编译阶段 确定函数地址动态多态的函数地址晚绑定运行阶段 确定函数地址②动态多态的满足条件有继承关系子类要重写父类的虚函数③动态函数的使用父类的指针或者引用要指向子类对象④多态的优点代码组织结构清晰可读性强利于前期和后期的扩展和维护## 纯虚函数和抽象类纯虚函数在多态中通常父类虚函数用处不大主要都是子类调用重写由此可以改为纯虚函数。语法virtual 返回值类型 函数名参数列表0抽象类当类中有纯虚函数这个类也称为抽象类。抽象类的特点①无法实例化对象②子类必须重写抽象类中的纯虚函数否则也属于抽象类。## 虚析构和纯虚析构虚析构语法virtual ~ 类名{}纯虚析构语法class Base{…virtual ~ 类名{}0}…类名::~类名{ …}问题在多态使用时子类中有属性开辟到堆区父类指针在释放时无法调用子类的析构函数造成内存泄漏解决方法将父类的析构改为虚析构/纯虚析构;验证class Animal { public: Animal() { cout Animal 构造函数 endl; } virtual void speak() 0; ~Animal() { cout Animal 虚析构函数 endl; } }; class Cat:public Animal { public: Cat(string name) { cout Cat 构造函数 endl; m_name new string(name); } virtual void speak() { cout * m_name小猫在说话 endl; } ~Cat() { if (m_name!NULL) { cout Cat 析构函数 endl; delete m_name; m_name NULL; } } string* m_name; }; void test() { Animal* an new Cat(Tom); an-speak(); delete an; }运行发现打印结果没有cat的析构函数在speak处下断点进入调试发现在执行完speak函数以后直接进入了Animal的析构函数并没有进入Cat的析构函数所以导致cat类的m_name指针无法释放。将父类的析构改为虚析构重复调试步骤发现这一次进入了cat的析构函数验证成功。虚析构和纯虚析构的共性可以解决父类指针释放子类对象都需要有具体的函数实现区别纯虚析构的类属于抽象类无法实例化对象。*注如果子类中没有堆区数据可以不写虚析构/纯虚析构。## 练习1.利用多态实现计算器#includeiostream using namespace std; class calculator { public: virtual int getResult() { return 0; } int num1; int num2; }; class Addcalculator:public calculator { public: int getResult() { return num1 num2; } }; class Subcalculator :public calculator { public: int getResult() { return num1 - num2; } }; class Mulcalculator :public calculator { public: int getResult() { return num1 * num2; } }; void test() { calculator* cal new Addcalculator; cal-num1 10; cal-num2 10; cal-getResult(); cout cal-num1 cal-num2 cal-getResult() endl; delete cal; cal new Subcalculator; cal-num1 10; cal-num2 10; cout cal-num1 - cal-num2 cal-getResult() endl; delete cal; cal new Mulcalculator; cal-num1 10; cal-num2 10; cout cal-num1 * cal-num2 cal-getResult() endl; delete cal; } int main() { test(); return 0; }## 补充虚函数调用链Animal *pnew Dog();p-speak();顺序1.p是父类指针指向Dog类的对象2.Dog对象内部有_vfptrvirtual function pointer虚函数指针3._vfptr指向Dog类的虚函数表4.虚函数表中[0]是Dog::speak5.最终执行Dog::speak。
延伸阅读

更多相关文章

2026/10/1 16:02:02

影视站源码深度拆解:自动采集、SEO魔改与苹果CMS实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 16:02:02

ARM设备运行Windows应用:FEX-Emu+Wine+DXMT跨平台兼容实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 16:02:02

微信小程序code获取原理与逆向实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 17:12:07

多任务YOLOv8实战:检测、可行驶区域与车道线分割一网打尽

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 17:12:07

稀土为什么能够改变材料性能?从4f电子到催化成炭

在钢铁中加入少量稀土,可以改善韧性;在铝合金中加入稀土,可以细化晶粒;在永磁材料中加入镝、铽,可以提升高温稳定性。稀土用量通常很少,却能显著改变材料性能,原因要从它的电子结构说起。4f电子…

2026/10/1 17:12:07

发个朋友圈还要定闹钟?微信定时发圈一次说清

先说清楚:微信本身没有定时发圈这个功能。所以不想再定闹钟、设置消息提醒自己该发朋友圈了,定时发圈就是最优解。定时发圈要解决的就是两件事:把“记住要发”和“到点去发”,全交给系统。你花十分钟,把今天要发的内容…

2026/10/1 17:12:07

无限大核心玩法是什么 无限大核心玩法介绍

不少玩家在预约无限大之后,最关心的问题就是无限大核心玩法到底是什么。简单来说,无限大核心玩法围绕“都市开放世界多角色切换载具驾驶”三大支柱展开,既有高楼摆荡的立体移动,也有追车射击的公路战。为了在电脑上体验这种高自由…

2026/10/1 17:07:07

Symfony Console 命令 Markdown 描述与多字节字符支持深度解析

后端Web框架 【免费下载链接】symfony The Symfony PHP framework 项目地址: https://gitcode.com/GitHub_Trending/sy/symfony 点击查看 免费下载 文章导读 本文聚焦 Symfony Console 组件中命令描述符(Descriptor)的 Markdown 输出格式&a…

2026/10/1 5:21:14

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/1 17:09:46

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑