64,654
社区成员
发帖
与我相关
我的任务
分享
// 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;
}
CBaseX *pD_interpret_BaseX = reinterpret_cast<CBaseX*>(pD);
CBaseY *pD_interpret_BaseY = reinterpret_cast<CBaseY*>(pD);
这两个转换都是未定义行为,不要写这样的代码。
派生类指针到基类指针直接使用隐式类型转换就行了,反过来的使用 static_cast 或 dynamic_cast。