我想将一个指向派生类成员的指针转换为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();
}
这将编译并给出所需的结果(打印1
and 2
分别),但它能保证工作吗?的描述static_cast
我在这里找到:http://en.cppreference.com/w/cpp/language/static_cast http://en.cppreference.com/w/cpp/language/static_cast仅提到转换为void*
并返回到指向same类(第 10 点)。
在一般情况下,通过静态转换将基类转换为 void 到派生(反之亦然)是不安全的。
在某些情况下,它几乎肯定会起作用:如果涉及的所有内容都是 Pod 或标准布局,并且只涉及单一继承,那么事情应该没问题,至少在实践中:我没有标准中的章节和诗句,但一般的想法是,在这种情况下,基数保证是派生的前缀,并且它们将共享地址。
如果你想开始看到这个失败,请混入virtual
继承、多重继承(两者virtual
而不是),以及非平凡的多重实现继承。基本上当不同类型视图的地址this
不同的是,void
从不同的类型转换回来是注定的。我在实践中看到过这种失败,并且它可能会失败(由于代码库的更改远离转换点),这就是为什么您要小心的原因always使用完全相同的类型向 void 指针进行强制转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)