C++ 多重继承的强制转换

C++ 多重继承的强制转换,c++,casting,multiple-inheritance,C++,Casting,Multiple Inheritance,如果您有一个指向派生类的void*指针,该派生类继承自BaseA和BaseB,编译器如何将void*指针强制转换为BaseA*(或BaseB*)在不知道void*指针的类型是派生的?的情况下,编译器不会将void*指针强制转换为任何对象,而程序员是这样做的 为了使用void*指针执行任何有用的操作,您需要将其显式转换为非void*指针,如果您对指针实际指向的类型有错误,则输入未定义的行为城市。它没有。使用static\u cast在void*上下浇铸时,唯一的保证是: 指针指向对象类型的值转换为

如果您有一个指向派生类的void*指针,该派生类继承自
BaseA
BaseB
,编译器如何将
void*
指针强制转换为
BaseA*
(或
BaseB*
)在不知道
void*
指针的类型是
派生的

的情况下,编译器不会将
void*
指针强制转换为任何对象,而程序员是这样做的


为了使用
void*
指针执行任何有用的操作,您需要将其显式转换为非
void*
指针,如果您对指针实际指向的类型有错误,则输入未定义的行为城市。

它没有。使用
static\u cast
void*
上下浇铸时,唯一的保证是:

指针指向对象类型的值转换为“指针指向
cv void
”并返回到原始指针类型将具有其原始值(C++03§5.2.9/10)

例如,以下代码不正确,因为
void*
被强制转换为原始指针类型以外的类型(强制转换顺序为
B1*
->
void*
->
B2*
):

结构B1{int i;}; 结构B2{int j;}; 结构D:B1,B2{}; dx; B1*b1ptr=&x; void*voidptr=b1ptr; B2*b2ptr=静态铸件(空隙PTR);
试图在此处使用
b2ptr
将导致未定义的行为。您可以安全地将
voidptr
转换为的唯一类型是
B1*
,因为这是获得
void*
的类型(或者转换为
char*
,因为任何内容都可以通过
char*
访问)。

您的答案是正确的。根据我的研究,如果派生扩展了BaseA和BaseB,则对象在内存中的布局为| BaseA | BaseB |派生|。因此,指针指向BaseA的开始,因此派生到BaseB的强制转换将使您读取BaseA的成员。
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);