5

结构的属性是否在 C++ 中继承

例如:

struct A {
    int a;
    int b;
}__attribute__((__packed__));

struct B : A {
    list<int> l;
};

结构 B(结构 A)的继承部分会继承打包属性吗?

我不能在没有得到编译器警告的情况下将a属性(( packed )) 添加到 struct B:

ignoring packed attribute because of unpacked non-POD field

所以我知道整个 struct B 不会被打包,这在我的用例中很好,但是我需要将 struct A 的字段打包到 struct B 中。

4

2 回答 2

4

struct B(struct A)的继承部分会继承packed属性吗?

是的。继承的部分仍将被打包。但是 pack 属性本身并没有被继承:

#include <stdio.h>

#include <list>
using std::list;

struct A {
    char a;
    unsigned short b;
}__attribute__((__packed__));

struct B : A {
    unsigned short d;
};

struct C : A {
    unsigned short d;
}__attribute__((__packed__));

int main() {
   printf("sizeof(B): %lu\n", sizeof(B));
   printf("sizeof(C): %lu\n", sizeof(C));

   return 0;
}

当被调用时,我得到

sizeof(B): 6
sizeof(C): 5

我认为您的警告来自非 POD 类型且本身未打包的 list<> 成员。另请参阅C++ 中的 POD 类型是什么?

于 2012-09-21T13:07:06.677 回答
4

是的,成员A将被打包struct B。必须是这样,否则会破坏整个继承点。例如:

std::vector<A*> va;
A a;
B b;
va.push_back(&a);
vb.push_back(&b);

// loop through va and operate on the elements. All elements must have the same type and behave like pointers to A.
于 2012-09-21T13:08:29.840 回答