【发布时间】:2010-07-25 01:27:42
【问题描述】:
如果你有一个指向 Derived 类的 void* 指针,它继承自 BaseA 和 BaseB,编译器如何在不知道 @ 987654326@指针的类型是Derived?
【问题讨论】:
标签: c++ casting multiple-inheritance
如果你有一个指向 Derived 类的 void* 指针,它继承自 BaseA 和 BaseB,编译器如何在不知道 @ 987654326@指针的类型是Derived?
【问题讨论】:
标签: c++ casting multiple-inheritance
它没有。使用static_cast 与void* 进行转换时的唯一保证是:
指向对象的指针类型的值转换为“指向
cv void”并返回到原始指针类型的值将具有其原始值(C++03 §5.2.9/10)。
例如,以下代码不正确,因为void* 被强制转换为原始指针类型以外的类型(强制转换顺序为B1* -> void* -> B2*):
struct B1 { int i; };
struct B2 { int j; };
struct D : B1, B2 { };
D x;
B1* b1ptr = &x;
void* voidptr = b1ptr;
B2* b2ptr = static_cast<B2*>(voidptr);
尝试在此处使用b2ptr 会导致未定义的行为。您可以安全地将voidptr 转换为的唯一类型是B1*,因为这是获得void* 的类型(好吧,或者是char*,因为任何东西都可以通过char* 访问)。
【讨论】:
编译器不会将void* 指针转换为任何东西——你,程序员,做的。
为了对void* 指针做任何有用的事情,您需要显式将其转换为非void* 指针,如果您对指针的实际类型有误指向,你进入未定义行为城市。
【讨论】: