C ++覆盖父结构的数据无法正常工作

时间:2018-07-17 08:21:25

标签: c++ inheritance struct

通常它是没有意义的,而且非常不安全,但是只有在理论上,如果有办法,

以下是示例:

#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函数按预期工作(但最终结构更大)

当然,存在多种不同的处理方式(例如,使用工会),但是我只玩这种方式,我很感兴趣为什么这种方式不起作用。

1 个答案:

答案 0 :(得分:5)

A类中,set函数确实是

void set(const uint32_t val) {
    (*this).operator=(*reinterpret_cast<const A *>(&val));
}

这将调用自动生成的A::operator=函数。但是由于A没有要复制的任何成员变量,因此它什么也不做。


现在您已经完成了实验,请不要再做类似的事情。