通常它是没有意义的,而且非常不安全,但是只有在理论上,如果有办法,
以下是示例:
#include<iostream>
struct A {
uint32_t &get() {
return *reinterpret_cast<uint32_t *>(this);
}
void set(const uint32_t val) {
*this = *reinterpret_cast<const A *>(&val);
}
};
struct B : A {
uint16_t a;
uint16_t b;
void set_b(const uint32_t val) {
*this = *reinterpret_cast<const B *>(&val);
}
};
main() {
B k;
k.a = 0x1234;
k.b = 0x5678;
std::cout << std::hex << k.get() << " : " << k.a << " " << k.b << std::endl;
k.set_b(0x87654321);
std::cout << std::hex << k.get() << " : " << k.a << " " << k.b << std::endl;
k.set(0xaabbccdd);
std::cout << std::hex << k.get() << " : " << k.a << " " << k.b << std::endl;
}
我得到这个结果:
56781234 : 1234 5678
87654321 : 4321 8765
87654321 : 4321 8765
但是我除了最后一个应该是:
aabbccdd : ccdd aabb
那么,为什么要从父级覆盖结构中的数据不起作用?
实验:我做了一个实验,向结构A中添加了一个变量,然后set函数按预期工作(但最终结构更大)
当然,存在多种不同的处理方式(例如,使用工会),但是我只玩这种方式,我很感兴趣为什么这种方式不起作用。
答案 0 :(得分:5)
在A
类中,set
函数确实是
void set(const uint32_t val) {
(*this).operator=(*reinterpret_cast<const A *>(&val));
}
这将调用自动生成的A::operator=
函数。但是由于A
没有要复制的任何成员变量,因此它什么也不做。
现在您已经完成了实验,请不要再做类似的事情。