c++ - 从 Derived* 到 void* 到 Base* 的 static_cast

标签 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(); 
}

这会编译并给出所需的结果(分别打印 12),但它能保证工作吗?我在这里找到的 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/

相关文章:

c++ - 如果我没有返回未知类型的东西,我应该返回什么

c++ - make_tuple 的构建问题 - 数组引用

c++ - 默认构造函数是在什么情况下生成的?

c++ - 什么是 internal::state::Entry 以及它在 mesos 中定义的位置

c++ - 由于值返回函数中的错误,程序无法编译。它说未声明的标识符

c++ - 如何对自定义对象使用static_cast?

c++ - 为什么 const_cast 和 static_cast 到 const 引用没有效果?

c++ - 如何使用静态转换管理共享对象的生命周期?

c++ - 从基类转换到派生类抛出异常

c++ - 用于遍历继承层次结构的 Static_cast 与 dynamic_cast