C++派生类指针赋值给基类指针问题(虚函数和非虚函数不同)
概念
-
上行转换:把派生类的指针或引用转换成基类表示,简单来说就是子类指向父类
-
下行转换:把基类指针或引用转换成派生类表示,简单来说就是父类指向子类
上行转换是安全的的,下行转换是不安全的(最好使用 dynamic_cast ,具体参考: xxx_cast 区别)
这里我们主要讨论上行转换,也就是派生类指针赋值给基类指针,下行转换可以参考上面那个链接 dynamic_cast 下行转换
先说结论:基类函数为虚函数和非虚函数情况不一样,下面分别进行讨论
非虚函数
参考:https://blog.csdn.net/ENSHADOWER/article/details/96638232
注意
- 编译器通过指针来访问成员变量,指针指向哪个对象就使用哪个对象的数据;
- 编译器通过指针的类型来访问成员函数,指针属于哪个类的类型就使用哪个类的函数。
虚函数
如果将 其中 的基类 A 的 display 函数改为虚函数,代码如下:
#include <iostream>
using namespace std;//基类A
class A {
public:A(int a);
public:virtual void display();
protected:int m_a;
};
A::A(int a) : m_a(a) { }
void A::display() {cout << "Class A: m_a=" << m_a << endl;
}//中间派生类B
class B : public A {
public:B(int a, int b);
public:void display();
protected:int m_b;
};
B::B(int a, int b) : A(a), m_b(b) { }
void B::display() {cout << "Class B: m_a=" << m_a << ", m_b=" << m_b << endl;
}//基类C
class C {
public:C(int c);
public:void display();
protected:int m_c;
};
C::C(int c) : m_c(c) { }
void C::display() {cout << "Class C: m_c=" << m_c << endl;
}//最终派生类D
class D : public B, public C {
public:D(int a, int b, int c, int d);
public:void display();
private:int m_d;
};
D::D(int a, int b, int c, int d) : B(a, b), C(c), m_d(d) { }
void D::display() {cout << "Class D: m_a=" << m_a << ", m_b=" << m_b << ", m_c=" << m_c << ", m_d=" << m_d << endl;
}int main() {A *pa = new A(1);B *pb = new B(2, 20);C *pc = new C(3);D *pd = new D(4, 40, 400, 4000);cout << "-------更改前-----" << endl;pa->display();pb->display();pc->display();pd->display();cout << "-----------------------" << endl;cout << "--------更改后-----------" << endl;pa = pd;pa->display();pb = pd;pb->display();pc = pd;pc->display();pd->display();cout << "-----------------------" << endl;system("pause");return 0;
}
最终输出结果为
-------更改前-----
Class A: m_a=1
Class B: m_a=2, m_b=20
Class C: m_c=3
Class D: m_a=4, m_b=40, m_c=400, m_d=4000
-----------------------
--------更改后-----------
Class D: m_a=4, m_b=40, m_c=400, m_d=4000
Class D: m_a=4, m_b=40, m_c=400, m_d=4000
Class C: m_c=400
Class D: m_a=4, m_b=40, m_c=400, m_d=4000
注意
- class A 的 display 函数是虚函数,更改指向之后,pa pb 调用的都是派生类的 display 函数,成员变量也就是相应派生类的
- 由于 class C 的 display 函数不是虚函数,所以更改指向之后,pc 依旧调用的是自身的 display 函数,但是成员变量 m_c 是派生类的
具体分析可以参考上面的链接
参考
https://blog.csdn.net/ENSHADOWER/article/details/96638232
最后附一份我整理的 CPP 面试相关知识点
https://github.com/EricPengShuai/Interview

如果觉得不错的话可以 ⭐️ 一下
相关文章:
C++派生类指针赋值给基类指针问题(虚函数和非虚函数不同)
概念 上行转换:把派生类的指针或引用转换成基类表示,简单来说就是子类指向父类 下行转换:把基类指针或引用转换成派生类表示,简单来说就是父类指向子类 上行转换是安全的的,下行转换是不安全的(最好使用…...
数据库实践LAB大纲 04 触发器
游标 系统为用户开设的一个数据缓冲区 —— 存T-SQL语句从数据库检索出来的结果集 对结果集处理:结果集一条条提取记录,这时要用游标 使用 利用基于变量的select into语句,只能处理单条记录使用游标循环处理 声明游标: DECLA…...
Win10系统电脑开机后总是蓝屏无法使用怎么办?
Win10系统电脑开机后总是蓝屏无法使用怎么办?电脑开机的时候出现了蓝屏问题,这个情况是我们的电脑系统不兼容导致的。遇到这个问题一般是需要去进行系统的重装来解决,安装一个更兼容的系统就可以解决问题了。一起来看看详细的解决方法分享吧。…...
Node——使用nvm切换node版本
1. 下载mvn安装包 https://pan.baidu.com/s/1alfyRvwVWr_TrkN0A9Er5g?pwd1v7c 2. 安装后命令输入mvn -v 验证是否安装成功 3. mvn命令 nvm list available 显示可下载的版本nvm install [node版本号] 显示可下载的版本nvm uninstall [node版本号] 删除已安装的指定版本nvm…...
go语言实现的一个基于go-zero框架的微服务影院票务系统cinema-ticket
一个基于go-zero框架的微服务影院票务系统cinema-ticket 前言 项目基本介绍 项目开源地址:butane123/cinema-ticket: 一个基于go-zero框架的微服务影院票务系统cinema-ticket (github.com) 这是一个微服务影院票务系统,基于go-zero框架实现,…...
ArcGIS API for JavaScript 4.15系列(3)——Dojo中的css样式操作
1、前言 前一篇博客介绍了Dojo中基础的dom操作方法,主要是针对html中的常用标签和属性进行操作。而一个优秀的线上网站自然也离不开css样式的从旁辅助。在实际开发过程中,我们经常会遇到需要动态修改css样式的问题,本文就来介绍一下如何在Do…...
“赶快回家网”首页制作
“赶快回家网”首页制作一、实验名称:二、实验日期:三、实验目的:四、实验内容:五、实验步骤:六、实验结果:七、源程序:八、心得体会:一、实验名称: “赶快回家网”首页…...
JavaWEB-Servlet
目录 Servlet简介Servlet快速入门Servlet配置详解ServletContext 1 Servlet简介 Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码&a…...
springboot集成mqtt
引入jar包 <dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-mqtt</artifactId> </dependency> <dependency><groupId>com.alibaba</groupId><artifactId>fastjs…...
Lecture3 梯度下降(Gradient Descent)
目录 1 问题背景 2 批量梯度下降 (Batch Gradient Descent) 3 鞍点(Saddle Point) 3 随机梯度下降 (Stochastic Gradient Descent) 4 小批量梯度下降 (Mini-batch Gradient Descent) 1 问题背景 图1 上节课讲述的穷举法求最优权重值在Lecture2中,介绍了使用穷举…...
深入了解DSP
一、时钟和电源 问:DSP的电源设计和时钟设计应该特别注意哪些方面?外接晶振选用有源的好还是无源的好? 答:时钟一般使用晶体,电源可用TI的配套电源。外接晶振用无源的好。 问:TMS320LF2407的A/D转换精度保证…...
Flink反压如何排查
Flink反压利用了网络传输和动态限流。Flink的任务的组成由流和算子组成,那么流中的数据在算子之间转换的时候,会放入分布式的阻塞队列中。当消费者的阻塞队列满的时候,则会降低生产者的处理速度。 如上图所示,当Task C 的数据处…...
windows无法访问指定设备路径或文件怎么办?2个解决方案
有时候Win10电脑打不开程序或文件,windows无法访问指定设备路径或文件该怎么办?原因是什么呢?一般导致这种情况的出现,大多是因为我们的电脑缺乏相应的查看权限,我们只需要通过赋予权限就可以解决这个难题了。 操作环境…...
冷知识|鹤顶红还能用来修长城?
大家好,我是建模助手。 在上篇浅浅地蹭了波热点之后,我灵机一动,倒不如也搞一搞建筑方面的冷知识?冷热搭配,事半功倍... 问问大家,如果谈起古建筑,关键词都有什么?是庄严、震撼、壮…...
【GD32F427开发板试用】在IAR环境中移植RTX5
本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:吴金刚 0.前言 首先感谢极术社区和兆易创新给了这次试用GD32F427开发板的机会。 板子做的虽然简约,但是自带了GD-link所以一根USB…...
MySQl学习(从入门到精通15)
MySQl学习(从入门到精通15)第 18 章_MySQL 8 其它新特性1. MySQL 8 新特性概述1. 1 MySQL 8. 0 新增特性1. 2 MySQL 8. 0 移除的旧特性2. 新特性 1 :窗口函数2. 1 使用窗口函数前后对比2. 2 窗口函数分类2. 3 语法结构2. 4 分类讲解1. 序号函…...
前端构建工具 Vite
文章目录参考环境构建工具构建工具的主要功能目前主流的前端构建工具Vite为什么使用 Vite冷启动WebpackVite热更新优化热更新优化预构建依赖Webpack VS ViteVite 的缺点首屏性能懒加载与 Vite 相关的基本操作获取create-vite创建项目Project nameSelect a frameworkSelect a va…...
若依框架---PageHelper分页(十)
在前几天的文章中,我们介绍了PageHelper的分页方法,研读代码定位到了ExecutorUtil.pageQuery(...)方法,并阅读到了其中的部分代码。 今天我们将看到重要的SQL修改代码。 getPageSql 我们接着看代码: if (!dialect.beforePage(…...
苹果手机专用蓝牙耳机有哪些?与iphone兼容性好的蓝牙耳机
蓝牙耳机摆脱了线缆的束缚,在地以各种方式轻松通话。自从蓝牙耳机问世以来,一直是行动商务族提升效率的好工具,苹果产品一直都是受欢迎的数码产品,下面推荐几款与iphone兼容性好的蓝牙耳机。 第一款:南卡小音舱蓝牙耳…...
CS-TPGS;壳聚糖修饰维生素E;Chitosan-g-TPGS
Chitosan-g-TPGS,CS-TPGS壳聚糖修饰维生素E聚乙二醇1000琥珀酸酯外观呈现白色固体或者粘稠液体。长期保存需要在-20℃,避光,干燥条件下存放,注意取用一定要干燥,避免频繁溶冻。 维生素E聚乙二醇琥珀酸酯(简称TPGS)是维生素E的水溶性衍生物,由维生素E琥珀酸酯的羧基与…...
超高清电视普及困境解析:从技术参数到生态系统的完整思考
1. 超高清电视的“非主流”开局:一场始于2013年的行业迷思 如果你在2013年初的拉斯维加斯CES展上,听到关于“Ultra HDTV”(超高清电视,后文简称UHDTV)的喧嚣,感觉就像身处一场盛大的交响乐彩排现场——乐手…...
AI浏览器扩展实战:从原理到应用,提升网页AI体验
1. 项目概述与核心价值如果你和我一样,每天花大量时间在浏览器里和各类AI工具打交道,那你肯定也遇到过这些烦心事:在亚马逊上挑个商品,想问问AI哪个型号更划算,得手动复制粘贴商品信息到另一个聊天窗口;用C…...
解决 Claude Code 频繁封号问题之转向 Taotoken 稳定服务
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决 Claude Code 频繁封号问题之转向 Taotoken 稳定服务 对于依赖 Claude Code 进行开发的工程师而言,账号访问权限的…...
自建链接管理服务OtterLink:从部署到实战的完整指南
1. 项目概述:一个链接管理的“瑞士军刀” 最近在折腾个人知识库和内容分发,发现一个痛点:手头攒了太多链接。技术文章、工具网站、项目仓库、临时笔记链接……散落在浏览器书签、聊天记录、备忘录里,时间一长要么找不到ÿ…...
veil:专为AI智能体设计的无头浏览器自动化工具
1. 项目概述:为AI智能体打造的“隐形之手”如果你正在构建或使用AI智能体,并且希望它能像真人一样操作浏览器——登录社交平台、发布内容、浏览网页、点击按钮——那么你很可能已经感受到了传统自动化工具的掣肘。Selenium、Puppeteer这些工具很棒&#…...
从零手写CNN:理解卷积网络的生物学原理与工程逻辑
1. 项目概述:从人眼到机器之眼,一次真实的视觉理解之旅你有没有盯着一张照片发过呆?比如朋友刚发来的旅行照——蓝天、雪山、一只歪头的雪豹。你几乎是一瞬间就认出了“雪豹”,甚至能判断它“在看镜头”“毛很厚”“可能刚睡醒”。…...
别再花钱买板卡了!手把手教你用NI-MAX虚拟PCI6224玩转LabVIEW数字IO
零成本玩转LabVIEW数字IO:NI-MAX虚拟设备全攻略 在工程教育与原型开发领域,硬件成本往往是阻碍学习进程的第一道门槛。一块标准的NI PCI-6224数字IO板卡市场价超过万元,而学生和独立开发者可能需要反复实验数十次才能掌握基础操作。但鲜为人知…...
解决ClaudeCode频繁封号与Token不足的Taotoken替代方案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决ClaudeCode频繁封号与Token不足的Taotoken替代方案 对于依赖Claude Code这类编程助手工具的开发者而言,访问不稳定…...
魔兽争霸3现代兼容性终极解决方案:WarcraftHelper深度优化指南
魔兽争霸3现代兼容性终极解决方案:WarcraftHelper深度优化指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为经典即时战略…...
毕业季救星:Word 2016域代码终极指南,让你的参考文献列表和文内引用完美同步
学术写作效率革命:用Word域代码构建智能参考文献系统 每到毕业季,总有一群人在深夜里对着电脑屏幕抓狂——他们的论文参考文献编号像多米诺骨牌一样,因为中间插入了一个新引用而全部错乱。手动调整几十处引用编号不仅耗时,还容易出…...
