Let\'s say, I have a struct RGB
and I want to create struct RGBA
, which inherits RGB
:
struct RGB {
unsigned char r
There is NO guarantees about the memory layout of derived members and the cast is NOT safe.
As you have inheritance, also there could be padding, this is NOT trivial.
§ 9 Classes
1 A POD struct109 is a class that is both a trivial class and a standard-layout class, and has no non-static data members of type non-POD struct, non-POD union (or array of such types). Similarly, a POD union is a union that is both a trivial class and a standard layout class, and has no non-
Also std::is_pod<RGBA>
is not a POD
std::cout << std::boolalpha;
std::cout << std::is_pod<RGBA>::value << '\n';
result is false. see live demo
It's easy to check for padding: Print sizeof(RGB)
and sizeof(RGBA)
. If it's not 3 respective 4 then the structures are padded, and you need to remove it.
As for if the member a
comes after b
, you can use offsetof to check each members offset. If the offset for a
is one larger than the offset of b
then a
comes directly after b
.
No, the layout is not guaranteed. The only guarantees are for standard-layout classes; and one of the conditions of such a class is that it
either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members
In other words, all data members must be in the same class, not in more than one.