C++(24)——语言级别提供的四种类型强转的方式

2023-10-30

前言

不同于C语言的类型转换的不安全性,无检查机制,比如没有关系的类型间的转换。
C++提供了更多的类型转换方式。

语言级别提供的四种类型强转的方式

  1. const_cast :去掉(指针或引用)常量属性的类型转换
  2. static_cast:提供编译器认为安全的类型转换,基本类型之间的转换以及子类向父类的安全转换
  3. reinterpret_cast类似于C风格的强制类型转换
  4. dynamic_case:主要用在继承结构中,子类和父类之间的安全转换(向上转换安全、向下转换时类型检查)
使用示例
1、const_cast,使用时注意保持类型的一致,经常用在去常性的地方

注意<>内部必须是指针或者引用类型,不能放一个常量

const int a = 10;
int *p1 = (int *)&a;
int *p2 = const_cast<int*>(&a);
2、static_cast,使用频率最高,相当于一种编译时期的类型转换

编译器只转换认为有联系的类型,在没有任何联系的类型之间做转换是不被允许的,比如int*——>short*,
若将int*——>double*,那么在解引用后,变成8个字节,不安全,但这个需要开发者自己解决,而不是由static_cast来保证。

int a = 10;
char b = static_cast<int>(a);

问题:基类类型和派生类类型能不能用static_cast? 可以,其类型之间存在关联

3、reinterpret_cast,类似于C风格的强制类型转换
4、dynamic_case

先上一个假想的使用场景:

class Base
{
public:
	virtual void func() = 0;
};
class Derive1:public Base
{
public:
	void func(){cout<<"call Derive1::func"<<endl;}
};
class Derive2:public Base
{
public:
	void func(){cout<<"call Derive2::func"<<endl;}
};

void showFunc(Base *p)
{
	p->func();//动态绑定
}

int main()
{
	Derive1 d1;
	Derive2 d2;
	showFunc(&d1);
	showFunc(&d2);
}

假设当前代码需求更改,在调用2对象时,使用其新功能:

class Derive2:public Base
{
public:
	void func(){cout<<"call Derive2::func"<<endl;}
	//Derive2实现的新功能的API接口函数
	void Derive2func(){cout<<"call Derive2::Derive2func"<<endl;}
};

那么我们就需要识别基类指针的类型,如果是Derive2就使用新功能,
我们可能会想到类似于下面这样的方法:

typedef(*ip).name() == "Derive2"

但是实际上,我们不会用上述这种类似于比较字符串的方法进行类型转换:
dynamic_cast会检查p类型的指针是否指向一个Derive2类型的对象,如果是则转换成功,返回Derive2的类型地址,否则返回nullptr
转换的原理依然是:p->vfptr->vftable->RTTI信息

void showFunc(Base *p)
{
	Derive2 *pd2 = dynamic_cast<Derive2*>(p);
	if(pd2 != nullptr)
	{
		pd2->Derive2func();
	}
	else
	{
		p->func();//动态绑定
	}
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++(24)——语言级别提供的四种类型强转的方式 的相关文章

  • 异步提交或回滚事务范围

    正如许多人所知 TransactionScope当async await Net 中引入了模式 如果我们尝试使用一些它们就会损坏await在事务范围内调用 现在这个问题已经解决了 感谢范围构造函数选项 a 17527759 1178314
  • Qt:更改 Mac OS X 上的应用程序 QMenuBar 内容

    我的应用程序对多个 页面 使用 QTabWidget 其中顶级菜单根据用户所在的页面而变化 我的问题是 尝试重新创建菜单栏的内容会导致严重的显示问题 它在除 Mac OS X 之外的所有平台上按预期使用第一种和第三种样式 尚未测试第二种 但
  • 输出 objdump -t 的输出中的“.hidden”是什么意思?

    Example objdump Logger cpp o t 00000000 g F text 00000000 hidden sti 10 Logger cpp 0b2ae32b 这意味着符号的可见性被隐藏 https develope
  • 获取枚举实例的名称[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 假设我有这个枚举 public enum MyEnum ValueOne 1 ValueTwo 2 ValueThree 3 然后
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 是否有任何现成的组件可用于计算对象上的表达式?

    我们想要解析以下类型的表达式 Func
  • 如何使用 LINQ 对列表的列表进行分组(例如:List>)

    我知道我可以使用一些 for 循环轻松地做到这一点 但想看看是否有一种方法可以使用流畅的 LINQ 来做到这一点 我试图找出每个子列表中有多少个 我在看Enumerable SequenceEqual http msdn microsoft
  • 表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 错误

    此错误发生在运行时 我不确定是什么原因导致的 代码对我来说看起来是正确的 include
  • 是否可以将 CMFCToolBar 添加到对话框中?

    我刚刚尝试了将 CToolbar 添加到新 CMFCToolBar 上的对话框的标准方法 但这不起作用 在我深入研究新的实现之前 我想知道它是否真的可行 我不确定你所说的 标准方式 是什么意思 但你当然可以以编程方式做到这一点 In MyD
  • DirectX Vertex 中的 THE 是什么

    我知道 RHW 是倒数同质 W 但有人可以解释一下它的使用方法和作用吗 gamedev论坛上的说明post http www gamedev net topic 440283 reciprocal of homogeneous w and
  • 使用 C 通过引用传递数组

    是的 我已经阅读了这个问题和答案 在 C 中通过引用传递数组 https stackoverflow com questions 1106957 pass array by reference in c 我有一个类似的问题 并从该问题中实现
  • 如何用C语言创建字典?

    我正在用 C 语言编写一个微控制器 作为它的一部分 我想在 7 段显示器上显示某些字母 每个字母都有一个对应的数字 使 7 段显示屏显示该字母 它没有真正的模式 因为数字只是通过将显示字母所需的 7 段显示器上的位相加而成 因此如果我可以创
  • 将 boost::iostreams::mapped_file_source 与 std::multimap 一起使用

    我有相当大量的数据需要分析 每个文件大约有 5gig 每个文件的格式如下 xxxxx yyyyy 键和值都可以重复 但键是按升序排列的 我正在尝试使用内存映射文件来实现此目的 然后找到所需的键并使用它们 这是我写的 if data file
  • 黑屏只是闪烁一会儿

    在我的 Windows Phone 8 应用程序中 我有一个搜索页面 其中有一个文本框供用户输入搜索关键字 输入默认SIP键盘的 Enter 键时将调用搜索 搜索结果显示在另一个页面中 为了在导航到结果页面之前隐藏键盘 我使用 this F
  • C# 从字符串变量中获取类型并在泛型方法中使用它

    我希望能够通过某种方式 即从数据库 获取我收到的字符串值的实际类型 这样我就可以在通用方法中使用该类型 例如DoSomething
  • 无法在 Visual Studio Code 的 C# 输出上键入任何内容

    所以我试图在 vscode 上运行一个非常基本的 C 程序 代码如下 using System namespace HelloWorld class Program static void Main string args string N
  • 如何收集和存储tellp()、tellg()返回类型?

    我正在编写一个在文件中维护 linked list 的程序 因此 我通过使用tellp tellg 遍历文件并将其添加到特定的长整数 可以视为偏移量 以到达新位置 一个简单的例子是 long next offset sizeof long
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 如何将 .ashx 处理程序与 asp:Image 对象一起使用?

    我有一个 ashx 处理程序 using System using System Web public class Thumbnail IHttpHandler public void ProcessRequest HttpContext
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧

随机推荐

  • Base64FileUtils工具类

    package com ruoyi common utils import org apache commons codec binary Base64 import java io public class Base64FileUtils
  • 报错注入的原理分析

    SQL报错注入就是利用数据库的某些机制 人为地制造错误条件 使得查询结果能够出现在错误信息中 这种手段在联合查询受限且能返回错误信息的情况下比较好用 01使用报错注入的前提 页面上没有显示位但是有sql语句执行错误信息输出位 使用mysql
  • android 标题栏,状态栏和导航栏的区别

    http blog csdn net baidu 26352053 article details 53025912 标题栏是手机左上最顶上 显示中国移动 安全卫士 或者当前运行软件的地方 手机的顶部 右边显示信号 电量 网速等等是状态栏
  • linux docker常用命令

    docker ps 显示当前正在运行的容器 docker ps a 显示所有状态的容器 docker images 列出本地镜像 docker port 容器Id 查看容器端口 lsof i 容器端口 检查容器端口是否可用 docker s
  • Prometheus 安装部署监控JMX

    系统环境 系统版本 centos7 Prometheus版本 2 20 1 服务器ip 192 168 0 226 客户端ip 192 168 10 62 一 服务器端系统安装 192 168 0 226 1 将下载好的包文件上传到服务器并
  • 前端学习之原生JS实现attr方法的封装

    HTML代码 img src images 1 jpg alt JS代码 功能 1 参数为2个 设置 2 参数为1个 设置批量属性 获取属性 function attr property value console log property
  • ubuntu18.04配置Swin Transformer环境

    1 安装pytorch pip install torch 1 8 1 i https pypi douban com simple pip install torchvision 0 9 1 i https pypi douban com
  • 电脑打开计算机显示远程过程调用失败,win7系统电脑弹出提示“远程过程调用失败且未执行”的解决方法...

    win7系统使用久了 好多网友反馈说win7系统电脑弹出提示 远程过程调用失败且未执行 的问题 非常不方便 有什么办法可以永久解决win7系统电脑弹出提示 远程过程调用失败且未执行 的问题 面对win7系统电脑弹出提示 远程过程调用失败且未
  • java 原始套接字编程_套接字编程原理

    6 多路复用 select 功能 用来检测一个或多个套接字状态 格式 int PASCAL FAR select int nfds fd set FAR readfds fd set FAR writefds fd set FAR exce
  • android里面layer-list中的inset和clip到底有什么作用

    Inset Drawable 用于通过指定的间距把图片插入到XML中 它在View需要比自身小的背景时常用 有些像padding的作用 例子 第一步 drawable文件中建立inset drawable xml
  • DB与缓存一致性

    一般方案中的设计均有其缺陷 要么会产生脏数据 要么会产生不一致 不同的是代价和概率 更新数据时 是先删除缓存再更新DB 还是先更新DB再删除缓存 https blog csdn net qq 33999844 article details
  • unity 如何获取到屏幕中间_Unity UGUI获取鼠标在屏幕的准确点击位置

    想要获取鼠标在屏幕的准确点击位置 千万不要胡乱写 什么转化坐标系 什么Ray射线检测都是浮云 1 转化坐标系只是相对而言 并不能准确实现当前鼠标点击在屏幕的位置 2 Ray检测 hit是需要碰撞的 没碰撞 获取的是什么 0 0 0 所以 请
  • css的选择器

    一 基本标签 标签选择器 格式 标签名 h1 文本内容 h1 类名选择器 格式 类名
  • Eclipse中断点调试详解

    小编是刚学习Java两个月 在学习视频中看到老师玩断点6到飞起 自己也就各种查资料 实施并总结了一下断点的调试 找到需要设置断点的位置 你可能会问 我怎么知道在哪设置断点呢 如果你实在不知道在哪设置断点 那你完全可以多设置几个断点 单步调试
  • Power小型机概念输理

    一 基本概念 一 Power System服务器POWER AIX RISC CISC SMT QCM SP Hypervisor LPAR POWER Performance Optimization With Enhanced RISC
  • Vue的样式绑定

    一 绑定class 1 第一种 样式和数据的绑定 通过对象方式 v bind class设置一个对象 当isActivated为true的时候 div上会增加一个class属性 属性名称为activated 如果再在css里加上activa
  • 推荐10个堪称神器的学习网站,IT学习网站

    挑选了 10 个堪称神器的学习网站 推荐给大家 如果觉得不错的话 文末请点赞 01 大学资源网 大学资源网是一个完全免费并且功能非常强大的学习网站 它免费提供了丰富并且全面的学习视频教程 并且视频课程一直在更新 非常良心 我比较看重的是它里
  • 前几天面了个32岁的测试员,年薪50w问题基本都能回答上,应该刷了不少八股文···

    互联网行业竞争是一年比一年严峻 作为测试工程师的我们唯有不停地学习 不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水 进入心仪的企业 阿里 字节 美团 腾讯等大厂 所以 大家就迎来了一堆问题 自己目前的能力能不能够支撑自己晋升 如果
  • php原生发送邮件

  • C++(24)——语言级别提供的四种类型强转的方式

    前言 不同于C语言的类型转换的不安全性 无检查机制 比如没有关系的类型间的转换 C 提供了更多的类型转换方式 语言级别提供的四种类型强转的方式 const cast 去掉 指针或引用 常量属性的类型转换 static cast 提供编译器认