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