Frage Struct-Attributvererbung in C ++


Sind die Attribute einer Struktur in C ++ geerbt?

z.B:

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

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

Wird der geerbte Teil von Struktur B (Struktur A) das gepackte Attribut erben?

Ich kann kein a hinzufügen Attribut((verpackt)) zu Struktur B, ohne eine Compiler-Warnung zu erhalten:

ignoring packed attribute because of unpacked non-POD field

Daher weiß ich, dass die gesamte Struktur B nicht gepackt wird, was in meinem Anwendungsfall gut ist, aber ich benötige die Felder von Struktur A, die in Struktur B gepackt werden sollen.


5
2017-09-21 12:52


Ursprung


Antworten:


Ja, die Mitglieder von A wird eingepackt struct B. Es muss so sein, sonst würde es den ganzen Punkt der Vererbung brechen. Beispielsweise:

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.

4
2017-09-21 13:08



Wird der geerbte Teil von Struktur B (Struktur A) das gepackte Attribut erben?

Ja. Der geerbte Teil wird noch gepackt sein. Aber das Paketattribut selbst wird nicht vererbt:

#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;
}

Wenn ich angerufen werde, bekomme ich

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

Ich denke, Ihre Warnung kommt von der Liste <> Mitglied, das ein Nicht-POD-Typ und selbst nicht gepackt ist. Siehe auch Was sind POD-Typen in C ++?


4
2017-09-21 13:07