C++ 将指向对象的指针强制转换为C+中的void*+;

C++ 将指向对象的指针强制转换为C+中的void*+;,c++,pointers,casting,C++,Pointers,Casting,我已经读了太多StackOverflow,开始怀疑我写过的所有代码,我一直在想“这是未定义的行为吗?”即使是在已经运行了很长时间的代码中 所以我的问题是——将指向对象(在本例中为抽象接口类)的指针强制转换为void*并随后将其转换回原始类并使用它们调用方法是否安全且定义良好 我完全知道,实现这一点的代码可能很糟糕。我甚至不考虑现在这样写(这是我不想改变的旧代码),所以我不想讨论更好的方法来做这件事。如果我再这样做的话,我已经知道如何写得更好了。但如果在C++中实际上依赖于这个,那么我必须看一下代

我已经读了太多StackOverflow,开始怀疑我写过的所有代码,我一直在想“这是未定义的行为吗?”即使是在已经运行了很长时间的代码中

所以我的问题是——将指向对象(在本例中为抽象接口类)的指针强制转换为void*并随后将其转换回原始类并使用它们调用方法是否安全且定义良好

我完全知道,实现这一点的代码可能很糟糕。我甚至不考虑现在这样写(这是我不想改变的旧代码),所以我不想讨论更好的方法来做这件事。如果我再这样做的话,我已经知道如何写得更好了。但如果在C++中实际上依赖于这个,那么我必须看一下代码的改变,如果它只是一个糟糕的代码,那么改变它不是一个优先事项。 我对一年前或两年前的简单事情毫无疑问,但随着对C++的理解的增加,我发现我越来越担心代码在标准下是安全的,即使它工作得很好。也许读取太多的堆栈溢出有时对生产率是一件坏事:P

所以我的问题是——将指向对象(在本例中为抽象接口类)的指针强制转换为void*并随后将其转换回原始类并使用它们调用方法是否安全且定义良好

是的,只要你回到完全相同的类型。否则,基类指针调整可能会破坏指针的值

实际上,这(可能)仅在使用多重继承时才相关:指向派生类的指针的物理地址可能与指向基类的指针的物理地址不同。

您是安全的

从C++(0x)草稿

§5.2.9/13(对于<代码>静态播放<代码>):

指针指向对象类型的值转换为“指针指向cv
void
”并返回,可能具有不同的cv限定,应具有其原始值

§5.2.10/7(对于
重新解释铸件
):

将“指向
T1
的指针”类型的右值转换为“指向
T2
的指针”类型(其中
T1
T2
是对象类型,其中
T2
的对齐要求不比
T1
的对齐要求严格),然后返回到其原始类型,即可生成原始指针值


(当然,强制转换到一个不相关的类是未定义的行为。)

我们通常使用这种技术,以避免根据您使用的环境(基于web、Windows、Linux等)在每个类中使用switch语句

使用
void**
作为参考

void ** detailObject;
创建一个函数以返回引用的对象:

TheObject *TheClass::GetObject(){
    TheObject *object   =   (TheObject*)object;
    return object;
}

从现在起,只需将函数用作对象。e、 g.
GetObject()->Go()

虽然这种行为在C++0x中当然没有改变,但我认为引用一个不被接受的标准草案来回答有关语言当前状态的问题并不是一个好的做法。谢谢。我觉得在C++编程10年后问这样一个基本问题是很愚蠢的,但是我对C++的学习越多,我就越怀疑自己。还有其他人有这种感觉吗。。。嗯,就我一个人。