gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:26:34 25 4
gpt4 key购买 nike

我想将指向派生类成员的指针转换为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com