C++ C++;覆盖父结构中的数据无效

C++ C++;覆盖父结构中的数据无效,c++,inheritance,struct,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 *>(&a

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

下面是一个例子:

#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;
}
但我认为最后一个应该是:

aabbccdd : ccdd aabb
那么,为什么从父级覆盖结构中的数据不起作用呢

实验: 我做了一个实验,将一个变量添加到结构A中,然后set函数按预期工作(但最终结构更大)


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

A
类中,
set
函数真的很有用

void set(const uint32_t val) {
    (*this).operator=(*reinterpret_cast<const A *>(&val));
}
void set(const uint32\u t val){
(*this.operator=(*reinterpret_cast(&val));
}
这将调用自动生成的
A::operator=
函数。但是由于
A
没有任何要复制的成员变量,因此它什么也不做



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

A
类中,
set
函数非常有用

void set(const uint32_t val) {
    (*this).operator=(*reinterpret_cast<const A *>(&val));
}
void set(const uint32\u t val){
(*this.operator=(*reinterpret_cast(&val));
}
这将调用自动生成的
A::operator=
函数。但是由于
A
没有任何要复制的成员变量,因此它什么也不做



既然你已经做了实验,请不要再做类似的事情。

你得到的结果取决于endianess,你的代码有多个未定义的行为。你得到的结果取决于endianess,你的代码有多个未定义的行为。所以,这意味着如果struct没有成员变量,那么它就不是struct?类似于namespace only?@vlk不太像名称空间,因为成员函数不是静态的,并且不能像使用名称空间那样将成员添加到结构中。
struct
仍然是一个
struct
,它可以被实例化为一个对象(如果你没有用删除的构造函数或类似的方法明确阻止它的话)。@vlk当然它是一个
struct
。只要你使用关键字<代码>结构> <代码>,它就是<代码>结构> <代码>(或者在C++中你可以称之为代码>类< /代码>)。唯一例外的是,琐碎的方法什么都不做。有时“空结构”很有用,比如在SFINAE技术中。所以,这意味着如果结构没有成员变量,那么它就不是结构?类似于namespace only?@vlk不太像名称空间,因为成员函数不是静态的,并且不能像使用名称空间那样将成员添加到结构中。
struct
仍然是一个
struct
,它可以被实例化为一个对象(如果你没有用删除的构造函数或类似的方法明确阻止它的话)。@vlk当然它是一个
struct
。只要你使用关键字<代码>结构> <代码>,它就是<代码>结构> <代码>(或者在C++中你可以称之为代码>类< /代码>)。唯一例外的是,琐碎的方法什么都不做。有时“空结构”是有用的,例如在SFINAE技术中。