static_cast从Derived*到void*到Base*

Rob*_*rto 7 c++ static-cast

我想将指向派生类的成员的void*指针转换为基类的指针,如下例所示:

#include <iostream>

class Base
{
    public:
       void function1(){std::cout<<"1"<<std::endl;}
       virtual void function2()=0;
};

class Derived : public Base
{
    public:
       virtual void function2(){std::cout<<"2"<<std::endl;}
};

int main()
{
    Derived d;
    void ptr* = static_cast<void*>(&d);
    Base* baseptr=static_cast<Base*>(ptr);
    baseptr->function1();
    baseptr->function2(); 
}
Run Code Online (Sandbox Code Playgroud)

这将编译并给出了期望的结果(打印12分别),但它是保证工作?static_cast我在这里找到的描述:http://en.cppreference.com/w/cpp/language/static_cast 仅提到转换为void*指向同一类的指针(第10点).

Yak*_*ont 8

在一般情况下,通过静态铸造将基础转换为空白到导出(反之亦然)是不安全的.

有些情况下它几乎肯定会起作用:如果所涉及的一切都是一个吊舱或标准布局,并且只涉及单一继承,那么事情应该没问题,至少在实践中是这样的:我没有标准的章节和经文,但一般的想法是,在这种情况下,基数保证是派生的前缀,并且它们将共享地址.

如果你想开始看到这个失败,那么混合virtual继承,多重继承(两者兼而有之virtual)和多重实现继承都是非常重要的.基本上当不同类型视图的地址this不同时,从而void返回到不同类型的转换是注定的.我已经看到这在实践中失败了,事实上它可能会失败(由于代码库的变化远离了投射点),这就是为什么你要小心总是使用完全相同类型的void指针进行强制转换.