新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++学习日记 Day10:多态

发布时间:2026/10/1 16:01:47来源:尧图网络
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。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Java人脸识别签到系统实战:稳定部署与活体防伪 2026/10/1 18:09:06

Java人脸识别签到系统实战:稳定部署与活体防伪

简介:本资源是一个基于Java实现的人脸识别签到系统开源项目,面向Java中级开发者及人工智能应用实践者,解决无接触身份核验与考勤管理场景下的技术落地问题。压缩包共225个文件,含65个Java核心业务与API调用代码、78个XML配置与布局…

阅读更多 →
不安全状态≠死锁:银行家算法与死锁避免的深度解析 2026/10/1 18:09:06

不安全状态≠死锁:银行家算法与死锁避免的深度解析

我用一个课堂上的真实场景来切入这个话题。讲操作系统原理时,每次讲完银行家算法和死锁那一章,总有学生追着问一个问题:老师,既然不安全状态这么危险,为什么书上说它不一定会变成死锁?那岂不是我们前面学了…

阅读更多 →
Bun新能力引爆AI调试:结构化错误信息让Node.js连夜复刻 2026/10/1 18:09:06

Bun新能力引爆AI调试:结构化错误信息让Node.js连夜复刻

昨天群里的讨论直接炸了。起因是有人转了一条消息,说Bun这次带来的新能力让前端圈没法淡定:不是又一轮跑分碾压,而是把“调试”这件事一口气往前推了一大截。尤雨溪都在公开场合直呼很好,评论区马上有人喊“Node.js要睡不着了”。…

阅读更多 →
第一次作业怎么交?从需求对齐到复盘迭代的完整交付指南 2026/10/1 18:09:06

第一次作业怎么交?从需求对齐到复盘迭代的完整交付指南

说起来有点不好意思,我印象里最深刻的一次“第一次作业”,是我毕业后第一份工作接到的数据报表任务。当时领导交代得很简单:“把上季度的用户活跃数据整理一下,周三前发我。” 我心想这事儿简单,打开Excel就开始拉数&a…

阅读更多 →
Pandas数据排序实战:DataFrame排序参数、多条件与性能优化 2026/10/1 18:09:06

Pandas数据排序实战:DataFrame排序参数、多条件与性能优化

“数据排序”这四个字,几乎是每个接触数据处理的人绕不开的第一道坎。不管是在头歌这类实训平台上刷经典题目,还是在实际业务里做报表、做分析,排序都是出现频率最高的操作之一。很多人一听“数据排序”就觉得简单,无非就是order …

阅读更多 →
1.69 万 GitHub Stars,这个具身方案爆火海外和学术圈。 2026/10/1 18:08:59

1.69 万 GitHub Stars,这个具身方案爆火海外和学术圈。

今年4月,一段用单目RGB相机实时重建三维空间的视频,率先在海外开发者社区传开了。 被马斯克、李飞飞、Jim Fan关注的泛AI创作者 Min Choi 则评价其**“这AI真够狂野的”。** 头部内容创作者 AI DRIVR 在 X 上评价其仅依赖单目 RGB 相机、无需激光雷达即…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉