首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

static_cast, dynamic_cast, reinterpret_cast, const_cast区别

但父类没有子类任何信息,而下行转换会调用到子类方法、引用子类成员变量,这些父类都没有,所以很容易“指鹿为马”或者干脆指向不存在内存空间。...,只是CAddition与CDummy类没有任何关系了,但main()C风格转换仍是允许padd = (CAddition*) &d,这样转换没有安全性可言。...上面三个类a是基类,b继承a,c和ab没有关系。    一个函数void function(a&a);    现在有一个对象是b实例b,一个c实例c。   ...在本文中,将说明static_cast实际上做了什么,并且指出一些将会导致错误情况。  ...在上面的例子,从一个void* 返回CDerived*唯一方法是将其转换为CBaseY*然后再转换为CDerived*。

76420

适合具备 C 语言基础 C++ 入门教程(八)

前言 在前一则教程,我们阐述了多态相关概念,其中就包括实现多态所必须虚函数,以及使用多态这个性质时一些限制内容,本节教程将着重讲解 C++类型转换问题,其中就包括:dynamic_cast、...dynamic_cast 动态类型转换,要说清楚这个概念,需要将之前一个例子拿出来叙述,人类,中国人,英国人这个例子,先回顾下这几个类代码,代码如下所示: class Human { private...) {cout<<"Chinese's test"<<endl; return this; } }; 上述是这几个类代码实现,在之前代码,我们还编写了一个测试函数,代码如下所示: void test_eating...,相比于之前那张图,这张图增加了类信息这一属性,图示如下: [image-20210220212322874] 也就是说类存在一个指针,这个指针不仅指向了虚函数表,而且指向了类信息,通过指针指向类信息...上述是将指针进行动态转换一个例子,那么如果是使用引用呢,如何进行转换,代码如下所示: void test_eating(Human& h) { Englishman& pe = dynamic_cast

35620
您找到你想要的搜索结果了吗?
是的
没有找到

你该知道C++四种显式类型转换

C++它自己一套类型转换方式。...const_cast , static_cast , dynamic_cast , reinterpret_cast const_cast 常量指针被转化成非常量指针,并且仍然指向原来对象; 常量引用被转换成非常量引用....同一份代码在使用不同编译器会有不同效果.在 vs2017 下,,虽然代码 c_val , use_val , ptr_val 看到地址是一样.但是c_val值并没有改变.可能在某种编译器实现后...这个检查主要来自虚函数(virtual function) 在C++面对对象思想,虚函数起到了很关键作用,当一个拥有至少一个虚函数,那么编译器就会构建出一个虚函数表(virtual method...因此注意下代码 Base 和 Sub 都有声明定义一个虚函数 ” i_am_virtual_foo” ,这份代码 Base 和 Sub 使用 dynami_cast 转换时检查运行期类型信息,

1.8K20

适合具备 C 语言基础 C++ 教程(八)

前言 在前一则教程,我们阐述了多态相关概念,其中就包括实现多态所必须虚函数,以及使用多态这个性质时一些限制内容,本节教程将着重讲解 C++类型转换问题,其中就包括:dynamic_cast、...dynamic_cast 动态类型转换,要说清楚这个概念,需要将之前一个例子拿出来叙述,人类,中国人,英国人这个例子,先回顾下这几个类代码,代码如下所示: class Human { private...,但是现在想新增加一个功能,也就是能够区分出来当前是英国人还是中国人,按照之前编写 C语言习惯,我们自然会想到增加一个type,然后不同国籍,给type赋不同值,然后根据数值来判断当前是中国人还是英国人...image-20210220212322874 也就是说类存在一个指针,这个指针不仅指向了虚函数表,而且指向了类信息,通过指针指向类信息,我们可以知道当前这个对象是属于哪个类,而且也能够知道当前这个类继承信息...上述是将指针进行动态转换一个例子,那么如果是使用引用呢,如何进行转换,代码如下所示: void test_eating(Human& h) { Englishman& pe = dynamic_cast

39020

boost.context-1.61版本设计模型变化

新增功能也只有execution_context(现在叫execution_context_v1),这个东西libcopp里其实包含了这个功能,并且本身做得比它要功能丰富,所以没有接入必要。...然而这挡不住非要直接用,哈哈。 重要是首先API参数和返回值变化,对于这些接口变更,boost里并没有文档,也没有什么地方说明,所以目前只能通过单元测试和sample来评估功能。...首先重要是多一个transfer_t,这个里面的两个对象,第一个*fctx*是来源执行上下文,第二个*data*是各种接口传入自定义指针(上面接口里vp)。...现在版本不再需要指定是否需要复制FPU了,同时也去除了自动保存当前上下文功能,并且改成了跳到新上下文后,新上下文可以知道自己是从哪跳转过来。...内部使用了侵入式智能指针,反正libcopp本身能够很容易实现这个,并且benchmark里本身就有使用预定内存池例子,所以我认为这是非关键功能。

3.2K10

C++四种强制转换

我们使用预定义控制了Child类实现。我们可以先关注没有定义USEERROR这个宏版本。另外一个版本我们将在后面介绍其设计意图。        ...说到这个问题,可能就要扯一点C++对象内存模型。这儿并不详细介绍其模型,只是想引出几个原理: 类成员函数实现,在内存一个唯一入口和唯一代码片。...其实类非静态函数一个参数——也是隐藏参数是这个类this指针。通过该this指针,该函数才能访问到对象成员数据。...于是在多线程环境下,一个对象函数在被多个线程执行时,它们会可能会修改同一个this指针一个数据。         如果能正确理解如上两点,则上例结果便可以得到理解了。 ?        ...这儿个需要指出是,如果我们使用dynamic_cast转换成一个引用对象,如果出错,将是抛出异常。如果不做异常捕获,将导致我们程序崩溃。

2.2K30

【C++】类型转换 ④ ( 子类 和 父类 之间类型转换 - 动态类型转换 dynamic_cast )

| 指针类型数据转换 ) 分析了 指针数据类型转换 , 在 C 语言环境下 , 可以使用显示强制类型转换 , 在 C++ 环境只能使用 重新解释类型转换 reinterpret_cast ; 本篇博客...一般用于 父类 ( 对象 / 指针 / 引用 ) 和 子类 ( 对象 / 指针 / 引用 ) 之间转换 , 是 C++ 语言特有的 , C 语言中没有该转换类型 ; 1、构造父类和子类 编写一个 父类..., 其中定义一个纯虚函数 ; 再编写两个 子类 , 重写 父类 纯虚函数 , 每个子类再 各自定义一个 特有的函数 ; // 父类 class Father { public: virtual void...< "son2_say" << endl; } }; 2、子类 和 父类 之间类型转换 - 隐式类型转换 先创建 子类对象 , 将子类对象 地址赋值给 父类指针 , 其中包含了 隐式转换 ; 在下面的代码...获取 Son* 类型 指针 , 将其使用 静态类型转换 static_cast 转为 Father* 类型指针 , 在 C++ 编译器编译阶段 , 会对类型进行检测 , 如果通过检测 , 则可以编译成功

34710

RTTI和类型转换运算符

1.1.1 dynamic_cast运算符 dynamic_cast运算符是RTTI中最常用组件,其主要功能是确定是否可以安全地将对地址赋给特定类型指针,如果可以则返回该特定类型指针,如果不可以则返回...,因此b2为0(空指针) 因此针对该例子,dynamic_cast常用场景如下: auto bs = new BaseX;//BaseX为Base、BaseA、BaseB任意一种类型,假设其具体类型只有在程序运行过程才能确定...1.1.3. type_info类 type_info类主要存储了有关特定类型信息,其中包含了一个name()成员,该成员函数主要用于调试,其需要与typeid搭配使用,使用方法如下: //class...> (expression) 如果类型其他方面也被修改,则上述类型转换将出错,也就是说除了const或volatile特征(或无)可以不同外,type_name和expression类型必须相同...reinterpret_cast 运算符并不会改变括号运算对象值,而是对该对象从位模式上进行重新解释。它主要用于将一种数据类型从一种类型转换为另一种类型。

58130

C++类型转换

reinterpret_cast操作符通常为操作数位模式提供较低层次重新解释,用于将一种类型转换为另一种不同类型 示例: typedef void (* FUNC)(); int DoSomething...只能用于含有虚函数类 dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0 示例: class A { public : virtual void f(){} }; class...static_cast,命名上理解是静态类型转换 使用场景: 用于类层次结构基类和派生类之间指针或引用转换 注意: 上行转换(派生类—->基类)是安全;下行转换(基类—->派生类)由于没有动态类型检查...,非法访问等各种问题) const_cast,字面上理解就是去const属性 使用场景: 常量指针转换为非常量指针,并且仍然指向原来对象 常量引用被转换为非常量引用,并且仍然指向原来对象...使用特点: cosnt_cast是四种类型转换符唯一可以对常量进行操作转换符 去除常量性是一个危险动作,尽量避免使用 reinterpreter_cast,仅仅重新解释类型,但没有进行二进制转换

1.9K20

c++之内存分配、命名空间、强制类型转换学习总结

c++通过new关键字进行动态内存申请。...Type[N]; // delete [] pointer; 下面我们来看一个例子: #include int main() { int *p = new int...3、reinterpret_cast强制类型转换: 用于指针类型之间强制转换 用于整数和指针类型之间强制转换 代码解析: #include void reinterpret_cast_demo...4、dynamic_cast强制类型转换(暂时有些概念没有学到,先记住结论): 用于继承关系类指针之间转换 用于交叉关系类指针之间转换 具有类型检查功能 需要虚函数支持 代码分析: #include...5、小结: 上面四种类型转换例子,前三种把错误地方给屏蔽掉,就是正确例子,第四种类型转换,暂时继承概念没有学到,所以这个例子不是很好。

44530

动态联编实现原理分析

C++标准并没有规定如何实现动态联编,但大多数C++编译器都是通过虚指针(vptr)和虚函数表(vtable)来实现动态联编。...可通过下面的程序考察在Visual C++,虚指针在对象位置。...那么,可以思考以下几个问题: (1)虚函数入口地址是按照什么顺序存放在虚函数表呢? (2)不同类(比如说父类和子类)是否可以共享同一张虚函数表呢?...(3)虚函数表是一个对象共享,还是一个对象就拥有一个虚函数表? (4)多重继承情况下,派生类多少个虚函数表呢?...以上代码描述是单继承情况下父类和子类虚函数表在内存结构,直观图示描述如下: image.png 注意:在上面这个图中,在虚函数表最后多加了一个结点,这是虚函数表结束结点,就像字符串结束符

42220

C++动态联编实现原理分析

C++标准并没有规定如何实现动态联编,但大多数C++编译器都是通过虚指针(vptr)和虚函数表(vtable)来实现动态联编。...可通过下面的程序考察在Visual C++,虚指针在对象位置。...那么,可以思考以下几个问题: (1)虚函数入口地址是按照什么顺序存放在虚函数表呢? (2)不同类(比如说父类和子类)是否可以共享同一张虚函数表呢?...因此,在程序中使用了宏ShowFuncAddress,利用内联汇编来获取类非静态成员函数入口地址。这是一个带参数宏,并且对宏参数做了一些特殊处理,如字符串化处理。...注意:在上面这个图中,在虚函数表最后多加了一个结点,这是虚函数表结束结点,就像字符串结束符“\0”一样,其标志了虚函数表结束。这个结束标志值在不同编译器下是不同

1.6K30

【Chromium】Base库ConditionVariable

这个功能在多个线程等待事件情况下非常有用,比如由主线程管理线程池。在线程池场景,事件含义是额外任务可用于处理。...在 Chrome ,它用于 DNS 预取系统,通知工作线程一个队列现在有需要处理项目(任务)。....); // 不要这样针对依赖其他线程发出信号才执行工作线程,更应该避免上述问题。可能会有虚假信号。在等待线程,在假设信号是激活之前,请重新检查信号状态。...void Signal();    // 声明此 ConditionVariable 只会被一个空闲线程在堆栈底部使用,并在等待工作时(特别是在恢复进行工作之前)不会同步等待此 ConditionVariable...#endif    // 一个线程在调用此 ConditionVariable 上 Wait() 时,是否应被视为被阻塞而不是空闲(如果是线程池一部分,则可能被替换)。

11010

乱谈CUTLASS GTC2020 SLIDES

MMA指令是在一个WARP内执行,所以各个线程对应取数据位置也是特殊映射关系。...这里觉得是作为一种理想情况估算,实际情况可能更复杂,需要考虑缓存命中率等(参考知乎李少侠文章) 因此cutlass抽象了一套高效数据搬运流程,过往很多GEMM优化文章都有介绍,就不赘述了: 其中在...(如果你常profile GEMM应该能有所体会) 并且它是一种异步操作,意味着我们可以提前发射出好几轮(在cutlass里往往称为Stage)数据预取指令,以实现延迟隐藏(,你算你)。...在没有LDMatrix之前,它需要对应四次LDS32操作,而如果我们调用LDMatrix,可以一个指令就完成上述操作: 下面我们简单提一下Cutlasscrosswise Layout(不是很明白...而Cutlass提出了一种新Layout,通过一系列很复杂异或操作算出来了一个索引,最终大概长这样: 这里每个线程存了128bit数据,也就是占了4个bank。

40810

几个使用protobufC++接口Arena

最近给我们项目的部分接口流程进行相关地改造,在大多数使用 protobuf 地方都增加了对Arena地支持,但是在接入过程也碰到了一些问题和坑。...对长期存在对象生命周期 Arena一个特点是它维护所有对象都是在Arena析构时候统一释放。这中间它内部维护内存块只会不断地append,并不会删除。...比如,我们是状态服务器,如果我们把一个用户数据块长期缓存在内存里,然后Arena和用户对象生命绑定。那么中间很多操作会不断地变更内部对象结构,这就会导致用户下线前Arena无限增长。...所以,我们主要对Arena集成最终集中在各个Task入口处,然后一个Task里子Task和RPC请求需要创建局部变量数据都复用这个Arena。...(basic_profile_); // 注意这里父Message如果Arena是空直接调用了delete子成员,这里没有判断子成员是否是在某个

5.5K51

C++显式类型转化

也有在读文件时候,直接把某个结构映射为内存,写文件时候,把某块内存直接映射成结构体。但其实在C++,有用于专门用于显示类型转化更合适更安全语法。   ...(重解释转换)   语法:A = reinterpret_cast(B)   这是一种最不安全转换,最有可能出现问题,reinterpret_cast把对象假想为模式,仿佛它是一个完全不同类型对象...,这是低级位操作,修改了操作数类型,但仅仅重新解释了对象比特模型而没有进行二进制转换,在使用reinterpret_cast做任何事情之前,实际上总是需要它回到原来类型。   ...从语法上看,这个操作符仅用于指针类型转换(返回值是指针)。它用来将一个类型指针转换为另一个类型指针,它只需在编译时重新解释指针类型。   这个操作符基本不考虑转换类型之间是否是相关。   ...,string*等各种指针,只要有别的方式确定某个void*当初类型是T*,标准保证reinterpret_cast(v[i])可以得到当初值。

1.7K70

【C++】C++规范 四种形式

: 如下图所示: 数字在计算机存储逻辑和现实生活中人们一般理解不太一样,是位形式存储;所以当pos设置为0时,程序会如此出错 2)显式类型转化 需要用户自己处理 int main() {...C风格转换格式很简单,但是不少缺点: 隐式类型转化有些情况下可能会出问题:比如数据精度丢失 显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己类型转化风格,注意因为C++...要兼容C语言,所以C++还可以使用C语言 转化风格。...规范 具体体现: 如果用户使用了不符合规范类型转换,编译器会标红,编译无法通过 1)static_cast——(相关类型/相近类型相互转换) int main() { // 相关类型/相近类型...B : public A { public: int _y = 0; }; void fun(A* pa) { // pa是指向子类对象B,转换可以成功,正常返回地址 // pa是指向父类对象

15110

C++四种类型转换运算符

int 和指针之间转换。将一个具体地址赋值给指针变量是非常危险,因为该地址上内存可能没有分配,也可能没有读写权限,恰好是可用内存反而是小概率事件。...由于 p 指向了 n,并且 n 占用是栈内存,写入权限,所以可以通过 p 修改 n 值。读者可能会问,为什么通过 n 和 *p 输出值不一样呢?...pb2->func()得不到 func() 正确地址原因在于,pb2 指向一个“对象”,它没有虚函数表,也没有虚函数表指针,而 func() 是虚函数,必须到虚函数表才能找到它地址。...下面我们通过一个例子来演示: #include using namespace std; class A{ public: virtual void...在《C++ RTTI机制下对象内存模型(透彻)》一节,我们讲到了虚函数存在时对象真实内存模型,并且也了解到,每个类都会在内存中保存一份类型信息,编译器会将存在继承关系类型信息使用指针“连接

22320
领券