我有:
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
物理体类。我不能以其他方式存储我的课程
答案 0 :(得分:3)
我建议将其重新投放到原始C*
,然后执行dynamic_cast
到B*
以遵循C ++规则 - 尽管您应该避免转换为{{1}首先使用基指针(void*
)代替void ptr。
答案 1 :(得分:1)
对于您显示的代码,可以直接转换为B*
,您可以使用static_cast
。但是,通常,指向基类和派生类的指针可能不同,您必须先将其转换为原始类型,然后再将其强制转换为指向base的指针。
编辑:在单一继承的实践中应该没问题,但通常它是UB。
答案 2 :(得分:1)
一般规则是当你从指针转换为void *
时,你应该总是回到最初来自的那个。
由于旧的API,施放到void *有时是必要的恶。
有时它是通过设计来创建一个“轻”模板。轻量模板是编写处理对象指针集合的代码的地方,这些代码都以相同的方式处理,这样可以防止必须为每种类型生成代码。
在这段代码中你有一个强类型的模板,可以做一个简单的来回转换(很可能是内联的),这样用户就可以得到强类型的代码,但是实现不那么臃肿。
答案 3 :(得分:0)
这样可以正常工作。在这种情况下,您只能访问A
和B
的方法。 (你只需“隐藏”C
的方法。)
答案 4 :(得分:-1)
施放到void *总是一个坏主意,所以做一个dynamic_cast。如果必须,它主要意味着您的代码需要重新分解,因为它是一个对象设计缺陷。