【发布时间】:2018-08-03 15:53:21
【问题描述】:
也许我的问题没有完美形成,但我的代码会让一切都清楚。
#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 是错误的设计。我没有考虑设计,但行为是困扰我的。 谁能解释一下为什么第一次使用不同的方式会产生不同的结果,但第二次会产生相同的结果??
【问题讨论】:
-
使用
reinterpret_cast几乎总是预示着糟糕的设计。避免它并重新考虑方法。 -
static_cast<B*>(pc)- “给我*pc的B部分的位置;reinterpret_cast<B*>(pc)- “将pc视为B的位置”。 -
@FrançoisAndrieux 这是实际的答案,你为什么不这样发布呢?
-
reinterpret_cast 和 c-style cast 基本一样吗?
-
@Zebrafish 不,c 风格的演员表可以是任何类型的演员表。 reinterpret_cast 在没有实际转换的情况下改变指针的类型(指针地址没有改变)。你只是用不同的方式解释相同的记忆。
标签: c++ inheritance casting reinterpret-cast static-cast