c ++ cast派生到void *并恢复基础

时间:2012-01-11 12:09:34

标签: c++ casting

我有:

class A {...};

class B : public A {...};

class C : public B {...};

然后我将C实例存储为void *:

C *instance = new C();
void *pC = instance;

可以这样做:

B *pB = reinterpret_cast<B*>(pC);

或者我必须只投射到C *?

PS:我的程序中有更多来自B的类,我不确定是否可以像我正在做的那样(对B *)。

为什么无效*:我在box2d引擎中使用void *userdata' field物理体类。我不能以其他方式存储我的课程

5 个答案:

答案 0 :(得分:3)

我建议将其重新投放到原始C*,然后执行dynamic_castB*以遵循C ++规则 - 尽管您应该避免转换为{{1}首先使用基指针(void*)代替void ptr。

答案 1 :(得分:1)

对于您显示的代码,可以直接转换为B*,您可以使用static_cast。但是,通常,指向基类和派生类的指针可能不同,您必须先将其转换为原始类型,然后再将其强制转换为指向base的指针。

编辑:在单一继承的实践中应该没问题,但通常它是UB。

答案 2 :(得分:1)

一般规则是当你从指针转换为void *时,你应该总是回到最初来自的那个。

由于旧的API,施放到void *有时是必要的恶。

有时它是通过设计来创建一个“轻”模板。轻量模板是编写处理对象指针集合的代码的地方,这些代码都以相同的方式处理,这样可以防止必须为每种类型生成代码。

在这段代码中你有一个强类型的模板,可以做一个简单的来回转换(很可能是内联的),这样用户就可以得到强类型的代码,但是实现不那么臃肿。

答案 3 :(得分:0)

这样可以正常工作。在这种情况下,您只能访问AB的方法。 (你只需“隐藏”C的方法。)

答案 4 :(得分:-1)

施放到void *总是一个坏主意,所以做一个dynamic_cast。如果必须,它主要意味着您的代码需要重新分解,因为它是一个对象设计缺陷。