dynamic与指针

C++类型父类与子类的转换--dynamic_cast - ren_zhg1992 - 博客园 (cnblogs.com)

#include <iostream>
using namespace std;class Base
{
public:Base() {};virtual void Show() { cout << "This is Base calss"; }
};
class Derived :public Base
{
public:Derived() {};void Show() { cout << "This is Derived class"; }void Dfun() { cout << "Dfun"; }
};
int main11()
{Base *base;Derived *der = new Derived;base = der;base->Show();   // This is Derived class      子类转父类,安全,且转换后,还是调用子类的虚函数,//base->Dfun(); //ERR: Dfun不是Base的成员   子类转父类,安全,但是转换后,不能再使用子类的非虚函数,return 0;
}
    base = dynamic_cast<Base*>(der);

子类转父类,不需要使用dynamic_cast,因为本身就是安全的,这样写还会有额外的开销。

直接强制转换即可。

base = der; 
base->Show();

这时候还是调用子类的虚函数 

但是base不可以再使用子类的非虚函数了。


#include <iostream>
using namespace std;class Base
{
public:Base() {};virtual void Show() { cout << "This is Base calss"<<endl; }
};
class Derived :public Base
{
public:Derived() {};virtual void Show() { cout << "This is Derived class"<<endl; }void Dfun() { cout << "Dfun"<<endl; }char name[10];
};
int main222()
{//场景一:Base *base = new Base;//Derived *der = base; //error C2440 : “初始化”: 无法从“Base * ”转换为“Derived *”Derived *der = dynamic_cast<Derived*>(base);   //执行完后  der是空指针,所以这个转换时无意义的//der->Show();  //编译没问题,运行就会报  der是nulptr的段错误。der->Dfun(); //OK   实际上同下一条语句//((Derived*)(0))->Dfun(); //OK//cout<<sizeof(((Derived*)(0))->name)<<endl;  // OK  10//正确使用场景: 父类指针指向子类对象,需要使用子类对象的非虚接口时Base *pB = new Derived;//Derived *pD = pB; //“初始化”: 无法从“Base * ”转换为“Derived *”  解析:多态是运行时才有的,Derived *pD = dynamic_cast<Derived*>(pB);pD->Dfun();  // 如果直接使用 pB->Dfun(); 就会报错,error C2039: 'Dfun' : is not a member of 'Base'cout << sizeof(pD->name)<<endl;  // OK  10pD->Show();return 0;
}
   Base *base = new Base;Derived *der = base; //error C2440 : “初始化”: 无法从“Base * ”转换为“Derived *”

基类不可强制转换为子类。

   Derived *der = dynamic_cast<Derived*>(base);   //执行完后  der是空指针,所以这个转换时无意义的der->Show();  //编译没问题,运行就会报  der是nulptr的段错误

强制转换失败,返回nullptr,空指针,所以转换可谓无意义,执行Show()函数,运行会报错。 

正确使用场景:

    Base *pB = new Derived;//Derived *pD = pB; //“初始化”: 无法从“Base * ”转换为“Derived *”  解析:多态是运行时才有的,Derived *pD = dynamic_cast<Derived*>(pB);pD->Dfun();  // 如果直接使用 pB->Dfun(); 就会报错,error C2039: 'Dfun' : is not a member of 'Base'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迷你手持小风扇哪个牌子质量好又实惠?这五款不踩雷推荐!

每年夏天&#xff0c;迷你手持小风扇作为消暑神器都会成为市场上的热销产品。然而&#xff0c;由于选购经验有限&#xff0c;许多消费者在面对众多品牌和型号时&#xff0c;往往难以判断哪个牌子的迷你小风扇既质量好又价格实惠。在追求性价比的同时&#xff0c;我们也不应忽视…

【设计模式】JAVA Design Patterns——Data Access Object(数据访问对象模式)

&#x1f50d;目的 对象为某种类型的数据库或其他持久性机制提供了抽象接口。 &#x1f50d;解释 真实世界例子 有一组客户数据需要持久化到数据库中。 我们需要整个额外的增删改查操作以便操作客户数据。 通俗描述 DAO是我们通过基本持久性机制提供的接口。 维基百科 在计算机…

【云原生】kubernetes中的认证、权限设置---RBAC授权原理分析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

基于UDP的TFTP文件传输-实现网盘上传下载功能

数据传输模式&#xff1a;octet(二进制模式) #include<head.h> char* down_up_request(char* buf,char* filename,int rw,int sockfd,struct sockaddr_in in); int download(struct sockaddr_in in,char* filename,char* buf,int sockfd); int upload(struct sockaddr_in…

Flask教程4:Flask数据交互

文章目录 使用flask处理表单flash闪现的使用Flask实现文件上传Session的使用为什么session比cookie安全?设置session获取session的值删除session的值或清空session所有内容 使用flask处理表单 传统的前端通用表单&#xff0c;需要前后端共同完成操作&#xff0c;前端需要使用…

百川大模型拿下国产第一,AI助手「百小应」上线,比Kimi强不少

最近几天&#xff0c;国内 AI 创业公司正在连续刷新大模型的能力上限。 5 月 22 日&#xff0c;百川智能发布最新一代基座大模型 Baichuan 4&#xff0c;同时推出了首款 AI 助手「百小应」。 相较 1 月份发布的 Baichuan 3&#xff0c;新一代模型在各项能力上均有大幅提升&am…

如何与“病态”的人建立友谊:一种基于理解与接纳的视角

在我们的生活中&#xff0c;我们经常会遇到一些行为举止让我们感到不适或难以理解的人。这些人可能因为他们的某些行为被标签为“病态”&#xff0c;但真的应该如此简单地对他们进行评判吗&#xff1f;本文将探讨如何与被视为“病态”的人建立友谊&#xff0c;以及为什么这种接…

分块优化思想

适用场景 将长区间&#xff08;n&#xff09;的顺序枚举查询优化至 n \sqrt{n} n ​个块的顺序枚举&#xff0c;这样单次查询枚举的数量会直接从O&#xff08;n&#xff09;降低至O&#xff08; n \sqrt{n} n ​&#xff09;。 实现手段&#xff1a; &#xff08;1&#xff09…

【云擎未来,智信天下】移动云服务器Docker部署+远程连接Redis

文章目录 引言&#xff1a; 移动云&#xff1a;云擎未来&#xff0c;智信天下一、什么是Redis&#xff1f;二、Redis 与其他 key-value 存储有什么不同&#xff1f;Redis 架构 三、环境准备四、部署流程使用Redis Desktop Manager远程连接操作数据库总结与未来展望云擎未来&…

安卓Bug总结

为什么写这篇文章 安卓十年开发遇到过得Bug做一个总结&#xff0c;大同小异&#xff0c;总结教训。 这里存放BUG目录列表 文章列表内容关键字Gradle常见问题及总结包括以下问题&#xff1a;gradle插件与gradle home版本关系错误、Gradle下载太慢、Executionfailed forJetifyTr…

java nio FileChannel堆内堆外数据读写全流程分析及使用(附详细流程图)

这里是小奏,觉得文章不错可以关注公众号小奏技术 背景 java nio中文件读写不管是普通文件读写&#xff0c;还是基于mmap实现零拷贝&#xff0c;都离不开FileChannel这个类。 随便打开RocketMQ 源码搜索FileChannel 就可以看到使用频率 kafka也是 所以在java中文件读写FileCh…

CRC校验(循环冗余校验 Cyclic Redundancy Check)(以Modbus通信为例)

文章目录 CRC校验在Modbus通信中的应用介绍CRC校验的基本原理校验原理核心多项式 CRC在Modbus通信中的实际应用数据格式校验流程1. 发送方&#xff1a;计算数据包&#xff08;不包括CRC校验码&#xff09;的CRC校验码&#xff0c;然后将校验码附加到数据包的末尾。2. 接收方&am…

集合的概述

java集合框架(Java Collections Framework)为开发者提供了一系列通用容器&#xff0c;所谓容器就是可以容纳其他对象的对象&#xff0c;在jdk1.2开始&#xff0c;就提供了通用容器。 1.Java集合框架的概述 容器是用于容纳其他对象的对象&#xff0c;因此基本数据类型无法直接使…

聚数力 以数兴 | 与“闽”同行,共话数字未来

闽江之畔&#xff0c;数智腾飞。5月24日&#xff0c;第七届数字中国建设峰会在海峡国际会展中心盛大举办。本届展会的主题是“释放数据要素价值&#xff0c;发展新质生产力”&#xff0c;由国家发展改革委、国家数据局、福建省人民政府等单位共同主办&#xff0c;福州市人民政府…

SVD求解Ax=0

源于计算机视觉life的LiDAR视觉IMU多传感器融合SLAM&#xff1a;原理推导源码逐行详解项目实战 SVD求解Ax0 首先&#xff0c;我们需要了解四元数的基本概念。四元数是由三个虚部和一个实部组成的复数扩展&#xff0c;可以用来表示三维空间中的旋转。四元数的乘法规则如下&…

数据恢复的救星!快速恢复手机数据的2个秘籍!

当我们的照片、视频、联系人、短信和应用程序丢失时&#xff0c;许多人可能会感到束手无策&#xff0c;无论是珍贵的照片、重要的工作文件还是个人的联系方式&#xff0c;一旦丢失&#xff0c;都可能带来极大的不便和困扰。但随着数据恢复技术的发展&#xff0c;我们有了更多的…

锐捷网络与您相约第七届数字中国建设峰会 共话数字未来

第七届数字中国建设峰会将于5月24日至25日在福建福州举办,本届峰会是国家数据工作体系优化调整后首次举办的数字中国建设峰会,主题是“释放数据要素价值,发展新质生产力”。作为行业领先的ICT基础设施及解决方案提供商,锐捷网络与福建省电子信息集团、星网锐捷,围绕“发展新质生…

2024中青杯数学建模竞赛A题人工智能视域下养老辅助系统的构建思路代码论文分析

2024中青杯数学建模A题论文和代码已完成&#xff0c;代码为A题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型的评价…

java练习2

题目要求 创建一个Color枚举类有RED,BLUE,BLACK,YELLOW,GREEN这五个枚举值/对象Color有三个属性redValue&#xff0c;greenValue&#xff0c;blueValue创建构造方法&#xff0c;参数包括这三个属性每个枚举值都要给这三个属性赋值&#xff0c;三个属性对应的值分别是red&#…

Windows批处理命令和概念

Windows中的BAT文件是一种批处理文件&#xff0c;它允许用户执行一系列命令和脚本。这些命令可以是简单的&#xff0c;如复制文件或删除文件&#xff0c;也可以是更复杂的&#xff0c;如运行程序或调用其他批处理文件。以下是一些常用的Windows批处理指令&#xff1a; ECHO - 显…