Смежный вопрос: Стандартная компоновка и хвостовое заполнение
Фрагмент:
#include <iostream>
#include <type_traits>
struct A0
{
int a;
char c;
};
struct B0 : A0
{ char d; };
struct A1
{
int a;
private:
char c;
};
struct B1 : A1
{ char d; };
struct A2
{
private:
int a;
char c;
};
struct B2 : A2
{ char d; };
int main()
{
std::cout << std::is_pod<A0>::value << ' ' << sizeof(B0) << std::endl; // 1 12
std::cout << std::is_pod<A1>::value << ' ' << sizeof(B1) << std::endl; // 0 8
std::cout << std::is_pod<A2>::value << ' ' << sizeof(B2) << std::endl; // 1 8
}
Live demo // Использование g ++
Обычно говорят, что, когда вы наследуете от типа POD с дополнением хвоста, по некоторым историческим причинам, Itanium ABI (честно говоря, я не знаю, что это такое) не позволяет повторно использовать заполнение хвоста подобъект базового класса, если таким подобъектом является POD.
Однако в третьем случае A2
- это POD, поскольку все его члены имеют одинаковое управление доступом, но B2
повторно использует такую оконечную прокладку. Это почему?