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
C++ reinterpret_cast详解[项目源码]
本文详细介绍了C++中的reinterpret_cast转换运算符,它通过重新解释底层位模式在类型间进行转换。与static_cast不同,reinterpret_cast不会编译成CPU指令,纯粹是编译时指令。文章列举了reinterpret_cast可以进行的10种转换场景,包括指针与整数间的转换、函数指针间的转换等,并强调了类型别名化规则的重要性。同时指出错误使用reinterpret_cast可能导致未定义行为,建议仅在需要将转换后的类型值转换回原始类型时使用。最后通过示例代码演示了reinterpret_cast的几种典型用法,并对比了其与const_cast的区别。
static_cast与reinterpret_cast区别[代码]
本文详细探讨了C++中static_cast和reinterpret_cast两种类型转换操作符的区别和应用场景。static_cast用于相关类型之间的转换,如数值精度调整、派生类与基类指针转换等,编译器会进行必要的截断或补齐操作。而reinterpret_cast则处理互不相关类型间的转换,如整型与指针间的转换,仅执行比特位拷贝,不进行任何检查。文章通过示例代码展示了两种转换的典型用法,并强调了reinterpret_cast在特定场景下的必要性,如指针与整型的互转。最后指出,理解其原理后,reinterpret_cast并非洪水猛兽,合理使用能解决实际问题。
C++四种cast转换[源码]
本文详细介绍了C++中的四种类型转换方式:dynamic_cast、static_cast、const_cast和reinterpret_cast。dynamic_cast主要用于有继承关系和多态的类之间的转换,确保类型安全;static_cast适用于多种类型转换,但不进行安全检查;const_cast用于去除const属性,允许修改原本为常量的值;reinterpret_cast功能强大但安全性低,可实现不相关类型之间的转换。文章通过示例代码展示了每种转换的具体用法和注意事项,帮助读者理解其适用场景和潜在风险。
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


