代码之家  ›  专栏  ›  技术社区  ›  vlk

从父结构重写数据不工作

  •  0
  • vlk  · 技术社区  · 6 年前

    通常它没有意义,非常不安全,但理论上只有在有办法的情况下,

    以下是示例:

    #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中添加一个变量,然后设置函数按预期工作(但最终的结构更大)

    当然,有不同的方法来处理这个问题(例如工会),但我只是在玩这个,我感兴趣的是为什么这不起作用。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Some programmer dude    6 年前

    A set

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

    A::operator=