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

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

注意

  1. class A 的 display 函数是虚函数,更改指向之后,pa pb 调用的都是派生类的 display 函数,成员变量也就是相应派生类的
  2. 由于 class C 的 display 函数不是虚函数,所以更改指向之后,pc 依旧调用的是自身的 display 函数,但是成员变量 m_c 是派生类的

具体分析可以参考上面的链接

参考

https://blog.csdn.net/ENSHADOWER/article/details/96638232

最后附一份我整理的 CPP 面试相关知识点

https://github.com/EricPengShuai/Interview

logo
如果觉得不错的话可以 ⭐️ 一下

相关文章:

C++派生类指针赋值给基类指针问题(虚函数和非虚函数不同)

概念 上行转换&#xff1a;把派生类的指针或引用转换成基类表示&#xff0c;简单来说就是子类指向父类 下行转换&#xff1a;把基类指针或引用转换成派生类表示&#xff0c;简单来说就是父类指向子类 上行转换是安全的的&#xff0c;下行转换是不安全的&#xff08;最好使用…...

数据库实践LAB大纲 04 触发器

游标 系统为用户开设的一个数据缓冲区 —— 存T-SQL语句从数据库检索出来的结果集 对结果集处理&#xff1a;结果集一条条提取记录&#xff0c;这时要用游标 使用 利用基于变量的select into语句&#xff0c;只能处理单条记录使用游标循环处理 声明游标&#xff1a; DECLA…...

Win10系统电脑开机后总是蓝屏无法使用怎么办?

Win10系统电脑开机后总是蓝屏无法使用怎么办&#xff1f;电脑开机的时候出现了蓝屏问题&#xff0c;这个情况是我们的电脑系统不兼容导致的。遇到这个问题一般是需要去进行系统的重装来解决&#xff0c;安装一个更兼容的系统就可以解决问题了。一起来看看详细的解决方法分享吧。…...

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 前言 项目基本介绍 项目开源地址&#xff1a;butane123/cinema-ticket: 一个基于go-zero框架的微服务影院票务系统cinema-ticket (github.com) 这是一个微服务影院票务系统&#xff0c;基于go-zero框架实现&#xff0c…...

ArcGIS API for JavaScript 4.15系列(3)——Dojo中的css样式操作

1、前言 前一篇博客介绍了Dojo中基础的dom操作方法&#xff0c;主要是针对html中的常用标签和属性进行操作。而一个优秀的线上网站自然也离不开css样式的从旁辅助。在实际开发过程中&#xff0c;我们经常会遇到需要动态修改css样式的问题&#xff0c;本文就来介绍一下如何在Do…...

“赶快回家网”首页制作

“赶快回家网”首页制作一、实验名称&#xff1a;二、实验日期&#xff1a;三、实验目的&#xff1a;四、实验内容&#xff1a;五、实验步骤&#xff1a;六、实验结果&#xff1a;七、源程序&#xff1a;八、心得体会&#xff1a;一、实验名称&#xff1a; “赶快回家网”首页…...

JavaWEB-Servlet

目录 Servlet简介Servlet快速入门Servlet配置详解ServletContext 1 Servlet简介 Servlet 运行在服务端的Java小程序&#xff0c;是sun公司提供一套规范&#xff08;接口&#xff09;&#xff0c;用来处理客户端请求、响应给浏览器的动态资源。但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中&#xff0c;介绍了使用穷举…...

深入了解DSP

一、时钟和电源 问&#xff1a;DSP的电源设计和时钟设计应该特别注意哪些方面&#xff1f;外接晶振选用有源的好还是无源的好&#xff1f; 答&#xff1a;时钟一般使用晶体&#xff0c;电源可用TI的配套电源。外接晶振用无源的好。 问&#xff1a;TMS320LF2407的A/D转换精度保证…...

Flink反压如何排查

Flink反压利用了网络传输和动态限流。Flink的任务的组成由流和算子组成&#xff0c;那么流中的数据在算子之间转换的时候&#xff0c;会放入分布式的阻塞队列中。当消费者的阻塞队列满的时候&#xff0c;则会降低生产者的处理速度。 如上图所示&#xff0c;当Task C 的数据处…...

windows无法访问指定设备路径或文件怎么办?2个解决方案

有时候Win10电脑打不开程序或文件&#xff0c;windows无法访问指定设备路径或文件该怎么办&#xff1f;原因是什么呢&#xff1f;一般导致这种情况的出现&#xff0c;大多是因为我们的电脑缺乏相应的查看权限&#xff0c;我们只需要通过赋予权限就可以解决这个难题了。 操作环境…...

冷知识|鹤顶红还能用来修长城?

大家好&#xff0c;我是建模助手。 在上篇浅浅地蹭了波热点之后&#xff0c;我灵机一动&#xff0c;倒不如也搞一搞建筑方面的冷知识&#xff1f;冷热搭配&#xff0c;事半功倍... 问问大家&#xff0c;如果谈起古建筑&#xff0c;关键词都有什么&#xff1f;是庄严、震撼、壮…...

【GD32F427开发板试用】在IAR环境中移植RTX5

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;吴金刚 0.前言 首先感谢极术社区和兆易创新给了这次试用GD32F427开发板的机会。 板子做的虽然简约&#xff0c;但是自带了GD-link所以一根USB…...

MySQl学习(从入门到精通15)

MySQl学习&#xff08;从入门到精通15&#xff09;第 18 章_MySQL 8 其它新特性1. MySQL 8 新特性概述1. 1 MySQL 8. 0 新增特性1. 2 MySQL 8. 0 移除的旧特性2. 新特性 1 &#xff1a;窗口函数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分页(十)

在前几天的文章中&#xff0c;我们介绍了PageHelper的分页方法&#xff0c;研读代码定位到了ExecutorUtil.pageQuery(...)方法&#xff0c;并阅读到了其中的部分代码。 今天我们将看到重要的SQL修改代码。 getPageSql 我们接着看代码&#xff1a; if (!dialect.beforePage(…...

苹果手机专用蓝牙耳机有哪些?与iphone兼容性好的蓝牙耳机

蓝牙耳机摆脱了线缆的束缚&#xff0c;在地以各种方式轻松通话。自从蓝牙耳机问世以来&#xff0c;一直是行动商务族提升效率的好工具&#xff0c;苹果产品一直都是受欢迎的数码产品&#xff0c;下面推荐几款与iphone兼容性好的蓝牙耳机。 第一款&#xff1a;南卡小音舱蓝牙耳…...

CS-TPGS;壳聚糖修饰维生素E;Chitosan-g-TPGS

Chitosan-g-TPGS,CS-TPGS壳聚糖修饰维生素E聚乙二醇1000琥珀酸酯外观呈现白色固体或者粘稠液体。长期保存需要在-20℃,避光,干燥条件下存放&#xff0c;注意取用一定要干燥,避免频繁溶冻。 维生素E聚乙二醇琥珀酸酯(简称TPGS)是维生素E的水溶性衍生物,由维生素E琥珀酸酯的羧基与…...

从“Hello World”到“入坑C语言”:给编程新手的思维转换与避坑指南

从“Hello World”到“入坑C语言”&#xff1a;给编程新手的思维转换与避坑指南 第一次在屏幕上打印出"Hello World"时&#xff0c;那种兴奋感就像解开了一道数学难题。但很快你会发现&#xff0c;编程和数学解题完全不同——它更像是在教计算机如何思考。许多新手在…...

告别手动拖拽!用ENVI的Crosshairs和Cursor Value功能,精准搞定无坐标影像拼接

告别手动拖拽&#xff01;用ENVI的Crosshairs和Cursor Value功能&#xff0c;精准搞定无坐标影像拼接 在遥感影像处理中&#xff0c;遇到没有地理参考信息的影像拼接任务时&#xff0c;很多用户的第一反应是手动拖拽对齐——这种看似直观的方法实际上效率低下且精度堪忧。想象一…...

从“能用”到“可靠”:基于SonarQube与Jenkins的Java代码质量防线构建实战

当测试覆盖率不再只是一串数字&#xff0c;而是合并代码前的“一票否决权” 1. 为什么你的“质量门禁”只是个摆设&#xff1f; 在很多团队的CI/CD流水线中&#xff0c;SonarQube的集成往往停留在“能跑就行”的阶段。流水线里确实有代码扫描这一步&#xff0c;日志里也打印出…...

SyntaxUI:基于Tailwind CSS与Framer Motion的React组件库实战指南

1. 项目概述&#xff1a;SyntaxUI&#xff0c;一个为现代Web开发者提速的组件库如果你和我一样&#xff0c;常年奋战在React、Next.js项目的一线&#xff0c;那你一定对“重复造轮子”这件事深恶痛绝。每次新项目启动&#xff0c;从零开始搭建按钮、卡片、模态框、导航栏&#…...

从相关性反馈到视觉理解:计算机视觉检索技术的演进与落地

1. 从“荒谬”到“范式转移”&#xff1a;一位计算机视觉先驱的二十年跋涉1995年&#xff0c;当互联网还处于襁褓之中&#xff0c;用技术自动搜索图片的想法听起来近乎“荒谬”。这是微软亚洲研究院副院长、首席研究员芮勇博士在回顾自己研究生涯起点时的感慨。二十多年后&…...

多智能体安全协调中的约束推断与CBF应用

1. 多智能体安全协调中的约束推断方法概述在分布式多智能体系统中&#xff0c;安全协调一直是个极具挑战性的问题。想象一下&#xff0c;当一群机器人在仓库中协同搬运货物时&#xff0c;每个机器人可能只知道部分环境信息&#xff08;比如某些障碍物的位置&#xff09;&#x…...

CODE-II:百万级心电图AI评估基准与深度学习模型实践

1. 项目概述&#xff1a;当心电图遇上AI&#xff0c;我们如何量化“看懂”的能力&#xff1f;心电图&#xff0c;这个在临床诊断中司空见惯的波形图&#xff0c;背后是心脏每一次搏动的电生理活动记录。医生们通过识别P波、QRS波群、T波的形态、间期和节律&#xff0c;来判断心…...

Radon实战指南:在CI/CD中集成Python代码质量检查的完整教程

Radon实战指南&#xff1a;在CI/CD中集成Python代码质量检查的完整教程 【免费下载链接】radon Various code metrics for Python code 项目地址: https://gitcode.com/gh_mirrors/rad/radon Radon是一个强大的Python代码质量分析工具&#xff0c;能够帮助开发者自动检测…...

不止于导航:用AI Habitat的语义分割数据,教你构建自己的室内物体识别与场景理解Pipeline

不止于导航&#xff1a;用AI Habitat的语义分割数据构建室内物体识别与场景理解Pipeline 在计算机视觉与机器人领域&#xff0c;室内场景理解一直是极具挑战性的研究方向。传统方法依赖于昂贵的传感器设备和人工标注数据&#xff0c;而仿真平台的出现为这一领域带来了革命性变…...

2024 Q2全球AI搜索基准测试TOP3结果泄露:Perplexity在长尾专业查询中胜率68.4%,但ChatGPT在模糊意图理解上反超——你的团队该押注哪条技术路径?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;2024 Q2全球AI搜索基准测试TOP3结果深度解读 本季度由MLPerf与AI Index联合发布的AI搜索基准测试&#xff08;SearchBench v2.1&#xff09;覆盖了17个主流模型&#xff0c;在真实网页索引、多跳推理、…...