gpt4 book ai didi

c++ - 转换到不同的基类会产生不同的结果。 C++

转载 作者:太空狗 更新时间:2023-10-29 20:34:22 25 4
gpt4 key购买 nike

也许我的问题并不完美,但我的代码会让一切都清楚。

#include <iostream>
using namespace std;

struct A{int n;};
struct B{int n;};
struct C : A, B{};

int main()
{
C c;
C* pc = &c;

std::cout<<"TEST1"<<std::endl;
cout << static_cast<B*>(pc) << "\n";
cout << reinterpret_cast<B*>(pc)<<"\n\n";

std::cout<<"TEST2"<<std::endl;
cout << static_cast<A*>(pc) << "\n";
cout << reinterpret_cast<A*>(pc)<<"\n";
}

输出是:

TEST1
0042F830
0042F82C

TEST2
0042F82C
0042F82C

我知道使用 reinterpret_cast 是错误的设计。我不是在考虑设计,但行为才是困扰我的地方。谁能解释为什么第一次使用不同的方式会产生不同的结果,而第二次会产生相同的结果??

最佳答案

本质上,AB部分 C不能占同一个空间。一个必须先于另一个。当您正确转换 C* 时到 A* , 你得到一个指向 A 的指针原始指针指向的实例的一部分,转换为 B* 也是如此.自 A的一部分 C ( int A::n; ) 和 B的一部分 C ( int B::n; ) 必然位于不同的地址,这些转换的结果自然也各不相同。这是可能的,因为编译器可以知道 pc 指向的对象的布局。 ,信息可以从它的类型中推导出来。如果信息不可用,这将不起作用,例如,如果指针被转换为 void*首先。

reinterpret_cast的原因无论您转换到什么,都会给出相同的地址,因为这就是 reinterpret_cast 的具体内容做。它将指针或引用转换为另一种类型,同时忽略任何形式的类型安全。至reinterpret_cast指针是创建一个新类型的指针,其地址与提供的地址相同,而不管实际类型和类型安全性。

注意使用 reinterprect_cast ,因为它本质上是将事实注入(inject)类型安全系统。编译器一定会假设您告诉它的是正确的。如果这些“事实”不正确(如 reinterpret_cast<B*>(pc) 的情况),您将面临未定义行为的风险。

关于c++ - 转换到不同的基类会产生不同的结果。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48950430/

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