转换为不同的基类会产生不同的结果. C
作者:互联网
也许我的问题没有完美形成,但我的代码将使一切都清楚.
#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是错误的设计.我不是在考虑设计,但行为是困扰我的.
任何人都可以解释为什么铸造不同的方式第一次给出不同的结果,但第二次相同的结果?
解决方法:
定义类也意味着定义内存布局.在其最简单的形式中,成员连续布局,例如,
struct A {
int n;
};
并在记忆中
| Address | Size | Member |
|----------+------+--------+
| 0042F82C | 4 | n |
基类也是如此
struct C : A, B {
};
潜在的内存布局
| Address | Size | Member |
|----------+------+--------+
| 0042F82C | 4 | A::n |
| 0042F830 | 4 | B::n |
现在,您有一个指向类型为C的对象的指针pc.使用static_cast
会考虑对象中成员和基类的布局.
因此,您可以获得A或B部件的正确地址.
在另一侧使用reinterpret_cast
,只需重用指针并假装它指向另一种类型.
Explanation
Unlike static_cast, but like const_cast, the reinterpret_cast expression does not compile to any CPU instructions. It is purely a compiler directive which instructs the compiler to treat the sequence of bits (object representation) of expression as if it had the type new_type.
这就是为什么你得到相同的地址值的原因.
标签:reinterpret-cast,static-cast,c,casting,inheritance 来源: https://codeday.me/bug/20190828/1748355.html