我想将指向派生类成员的指针转换为 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
和 2
),但它能保证工作吗?我在这里找到的 static_cast
的描述:http://en.cppreference.com/w/cpp/language/static_cast
只提到转换为 void*
并返回到指向 相同 类的指针(第 10 点)。
最佳答案
在一般情况下,通过静态转换将 base 转换为 void 到 derived(反之亦然)是不安全的。
在某些情况下它几乎肯定会起作用:如果涉及的所有内容都是 pod 或标准布局,并且只涉及单一继承,那么事情应该没问题,至少在实践中是这样:我没有章节和诗歌来自标准,但一般的想法是,这种情况下的基保证是派生的前缀,并且它们将共享地址。
如果您想开始看到这种失败,请混合使用 virtual
继承、多重继承(virtual
和非虚拟)以及非平凡的多重实现继承。基本上,当 this
的不同类型 View 的地址不同时,void
从和返回到不同类型的转换就注定了。我在实践中看到了这种失败,事实上它可能会失败(由于远离转换点的代码库发生了变化),这就是为什么你要小心总是来回转换具有完全相同类型的 void 指针。
关于c++ - 从 Derived* 到 void* 到 Base* 的 static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19614322/