使用多重继承进行转换

Cha*_*azz 6 c++ casting multiple-inheritance

如果你有一个void*指针指向派生类来自继承BaseA和BaseB,编译器如何投的void*指针BaseA*(或BaseB*)不知道该void*指针类型的Derived?

Jam*_*lis 5

它没有.在void*使用a进行转换时的唯一保证static_cast是:

转换为"指向"指针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);
Run Code Online (Sandbox Code Playgroud)

试图在b2ptr这里使用会导致未定义的行为.你可以安全地投射的唯一类型voidptr是B1*,因为这是void*获得它的类型(好吧,或者a char*,因为任何东西都可以通过a访问char*).