我尝试使用reinterpret_cast
将指针强制转换为其他类型class MyClassA
{
int x;
int y;
public:
MyClassA();
~MyClassA();
};
class MyClassB
{
int x;
int y;
public:
MyClassB();
~MyClassB();
};
例如,如果我将一个指向MyClassA的指针转换为MyClassB,那么使用reinterpret_cast这个转换会起作用吗?代码可移植性怎么样?
而且,正如我所说:
(5.2.10 / 4)指针可以显式转换为任何整数类型 大到足以容纳它。
这是否意味着任何指针,例如MyClassA*
只能转换为int *指针?如果我正确的话?
答案 0 :(得分:1)
关于这是否有效我不知道,这将取决于实现。
然而,标准不保证这会起作用(所以不要这样做),MyClassA和MyClassB是两种不兼容的类型,即使它们在结构上是相同的。
同样适用于int *。
如果您需要在那之间进行转换,那么您可以创建A到B赋值运算符
class MyClassA{
...
operator=(const MyClassB& mcb)
{
this.x=mcb.x;
this.y=mcb.y;
}
};
如果您需要访问MyClassA中的整数元素。
//in MyClassA
int& getX(){ return x; }
const int& getX() const { return x; }
int& x=mca.getX();
答案 1 :(得分:1)
(5.2.10 / 4)指针可以显式转换为足以容纳它的任何整数类型。
这意味着int*
到int
。指针不是整数类型。
投射不相关类型的指针是坏消息,不应该这样做。 可以工作,但不可移植。
继承虽然有效。让类型继承自基类!
答案 2 :(得分:0)
这并不意味着你可以施放不相关的类型。这意味着如果在你的平台上64bit整数足够大以包含指针值,你可以将指针转换为64位整数(例如)。
PS:我想提一下你所做的完全偏离了标准,但你可能会在许多平台/编译器上侥幸逃脱:)
答案 3 :(得分:0)
我对第一个问题的回答是肯定的。指针只是一个变量(整数),其值是另一个存储单元的地址。这就是为什么你能够做到以下几点。
(*(void(*)())0)(); /*Ref: Andrew Koenig C Traps and Pitfals*/
或
#define CARD_INTERFACE_ADDRESS 0x4801C
struct A * = new (CARD_INTERFACE_ADDRESS) struct A
MyClassA * ptr_a
无法(逻辑上)转换为int* ptr_i
,因为您所说的是变量ptr_a
所拥有的地址是MyClassA
的地址前者而后者则说ptr_i
是int
的地址。