新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++---多态入门

发布时间:2026/9/4 1:31:35来源:尧图网络
C++---多态入门
虚函数的重写所以虚函数的重写实际上在重写的是函数体多态的实现也是靠重写虚函数实现的。注意上边的ptr始终是Person类型的指针图片里说的ptr的指向是指的其指向的对象因为传给ptr的是指向Student的指针ptr指向的对象是Student指向哪个对象调用的就是该对象里的函数体。一道恶心的题问程序运行结果是什么class A { public: virtual void func(int val 1) { std::cout A- val std::endl; } virtual void test() { func(); } }; class B : public A { public: void func(int val 0) { std::cout B- val std::endl; } }; int main(int argc, char* argv[]) { B* p new B; p-test(); p-func(); return 0; }首先明确继承不是拷贝说白了只是改变了编译器的查找逻辑让编译器多到一个地方去找然后定义派生类的对象的时候在内存里上边先有一份基类下边才是自己的成员。p是指向B的指针p调用test函数是先在B里没找到再去A里找到了因此就调用A里的testA里的test的this指针指向的自然就是A*this指针去调用func由于this真正指向的是B因此就去调用B里的func跟上边同理仅仅只是使用函数体函数声明还是A里的函数声明因此val的缺省值是1。所以程序运行结果就是B-1。注意上边的分析都是建立在多态的前提之下的func构成多态满足多态的2个条件。这里别看两个func的参数缺省值不一样但它们是构成重写的重写有3同只要是返回值类型函数名函数参数列表相同(参数列表的类型相同)跟缺省值什么的都没关系。改编此时运行结果又如何。B* p new B; p-func();结果是B-0这里的调用就是普通调用根本不构成多态调用func的仅仅是B*类型的指针也就是派生类自己本类型的指针在调用自己类里边的成员函数。析构函数的重写class A { public: ~A() { cout ~A() endl; } }; class B : public A { public: ~B() { cout ~B() endl; } }; int main() { //普通调用就是直接看类型就可以了 A* p1 new A; A* p2 new B; delete p1; delete p2; return 0; }由于普通调用直接看类型p1和p2都是A类型的指针delete的时候自然就是调用了两次A类里的析构函数没有调用B类的析构此时造成内存泄露。delete的原理是先调用对应类的析构函数再调用operator delete底层用free释放资源。所以我们需要将~A()变成虚函数实现多态解决内存泄露。虚函数表(本质是函数指针数组)当派生类继承含有虚函数的基类时其虚函数表并非直接拷贝基类虚函数表而是以基类虚函数表为模板进行构建编译器先将基类虚函数表的所有条目完整继承到派生类虚函数表中若派生类重写了基类的某个虚函数会将派生类虚函数表中该虚函数对应位置的函数指针替换为派生类自身重写后的函数地址(即实现 “覆盖”)。派生类独有的、基类中没有声明的虚函数会按声明顺序追加到派生类虚函数表的末尾。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

基于深度学习的LS信道估计:Python实现与性能优化 2026/9/4 2:53:14

基于深度学习的LS信道估计:Python实现与性能优化

简介:本资源是一套基于Python与深度学习实现的LS(最小二乘)信道估计完整方案,面向通信工程、信号处理方向的本科生及研究生,适用于毕业设计、课程设计与小型科研项目开发。项目聚焦无线通信系统中信道状态信息的高效估…

阅读更多 →
开源权重模型登顶电商Agent评测?先看懂CommerceAgentBench再谈选型 2026/9/4 2:53:14

开源权重模型登顶电商Agent评测?先看懂CommerceAgentBench再谈选型

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

阅读更多 →
Python车牌识别系统:从OpenCV图像处理到字符识别全流程解析 2026/9/4 2:53:14

Python车牌识别系统:从OpenCV图像处理到字符识别全流程解析

简介:本资源是一套完整的Python毕业设计项目——车牌识别系统源码,面向计算机、人工智能及相关专业本科生,解决智能交通场景下的车辆牌照自动定位与字符识别问题。压缩包共288个文件,总大小40.39MB,涵盖54个核心Python…

阅读更多 →
三相异步电机启动方式详解:星三角降压启动原理与接线误区 2026/9/4 2:53:14

三相异步电机启动方式详解:星三角降压启动原理与接线误区

一台15kW空压机一启动,车间照明闪了两下,旁边的PLC偶尔报欠压,变频器甚至直接跳闸。操作工说:“这个电机力气太大了,得要降压启动。”电气工程师翻开电机铭牌,看到“380V Δ”和六个接线端子,决…

阅读更多 →
Riddle v0.1.1尝鲜指南:融合Rust与Go特性的新语言初探 2026/9/4 2:53:14

Riddle v0.1.1尝鲜指南:融合Rust与Go特性的新语言初探

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

阅读更多 →
Qt与OpenCV构建工业视觉检测系统:多线程架构与算法实践 2026/9/4 2:50:14

Qt与OpenCV构建工业视觉检测系统:多线程架构与算法实践

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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