reinterpret_cast问题

bluesnail1986 bluesnail1986 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
C++初学者,下午在写一个关于static_cast/reinterpret_cast的小例子的时候,偶然发现一个问题,代码很简单,如下:
// TestSolution.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;
class CBaseX{
public:
int a;
int b;
CBaseX() :a(0x100), b(0x200){};
virtual void SetA(int a_tmp)
{
a = a_tmp;
}
};
class CBaseY{
public:
int c;
CBaseY() :c(0x300){};
virtual void SetC(int c_tmp)
{
c = c_tmp;
}
};
class CDerived :public CBaseX, public CBaseY{
public:
int d;
virtual void SetC(int c_tmp)
{
c = c_tmp + 1;
}
virtual void SetA(int a_tmp)
{
a = a_tmp + 2;
}

};

int _tmain(int argc, _TCHAR* argv[])
{
CDerived *pD = new CDerived;
CBaseX *pD_interpret_BaseX = reinterpret_cast<CBaseX*>(pD);
CBaseY *pD_interpret_BaseY = reinterpret_cast<CBaseY*>(pD);
CBaseX *pD_BaseX = pD;
CBaseY *pD_BaseY = pD;
CBaseY *pD_static_BaseY = static_cast<CBaseY*>(pD);

pD_interpret_BaseY->SetC(0xa00);//Jump to CDerived::SetA(), Why...?
pD_static_BaseY->SetC(0xb00);
pD_BaseX->SetA(0xc00);

return 0;
}


每次调用pD_interpret_BaseY->SetC(0xa00);的时候,代码就会走到CDerived::SetA()里去,为何?我明白reinterpret_cast是binary复制,但怎么也不会调用到SetA()里去吧?
另外,如果将Derived类里的virtual void SetA(int a_tmp),参数改成char型,将SetA()从覆盖变成隐藏,则出错的调用会直接到CBaseX::SetA()里去~~求教高手...
Btw,Win Blue 64bit英文版操作系统,VS2013,32位或64位都会出错
...全文

相关推荐

dynamic_cast,static_cast 和 reinterpret_cast

讨论 dynamic_cast,static_cast<> 和 reinterpret_cast<> and Runtime Type Information

ecomprj

C++ reinterpret_cast详解[项目源码]

本文详细介绍了C++中的reinterpret_cast转换运算符,它通过重新解释底层位模式在类型间进行转换。与static_cast不同,reinterpret_cast不会编译成CPU指令,纯粹是编译时指令。文章列举了reinterpret_cast可以进行的10种转换场景,包括指针与整数间的转换、函数指针间的转换等,并强调了类型别名化规则的重要性。同时指出错误使用reinterpret_cast可能导致未定义行为,建议仅在需要将转换后的类型值转换回原始类型时使用。最后通过示例代码演示了reinterpret_cast的几种典型用法,并对比了其与const_cast的区别。

convnet3designer

static_cast与reinterpret_cast区别[代码]

本文详细探讨了C++中static_cast和reinterpret_cast两种类型转换操作符的区别和应用场景。static_cast用于相关类型之间的转换,如数值精度调整、派生类与基类指针转换等,编译器会进行必要的截断或补齐操作。而reinterpret_cast则处理互不相关类型间的转换,如整型与指针间的转换,仅执行比特位拷贝,不进行任何检查。文章通过示例代码展示了两种转换的典型用法,并强调了reinterpret_cast在特定场景下的必要性,如指针与整型的互转。最后指出,理解其原理后,reinterpret_cast并非洪水猛兽,合理使用能解决实际问题。

kkk56

C++四种cast转换[源码]

本文详细介绍了C++中的四种类型转换方式:dynamic_cast、static_cast、const_cast和reinterpret_cast。dynamic_cast主要用于有继承关系和多态的类之间的转换,确保类型安全;static_cast适用于多种类型转换,但不进行安全检查;const_cast用于去除const属性,允许修改原本为常量的值;reinterpret_cast功能强大但安全性低,可实现不相关类型之间的转换。文章通过示例代码展示了每种转换的具体用法和注意事项,帮助读者理解其适用场景和潜在风险。

yy01234

C++中4种强制类型转换的区别总结

前言 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast。   const_cast,字面上理解就是去const属性。   static_cast,命名上理解是静态类型转换。如int转换成char。   dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。   reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。 一、static_cast 用法:static_cast (expression) 该运算符把expression转换为ty

weixin_38681318
评论 6
收藏 已收藏
分享
返回顶部
bluesnail1986
C++ 语言 65,214 成员 250,514 内容