Это требования для стандартного типа макета:
Все нестатические элементы данных имеют одинаковое управление доступом
Не имеет виртуальных функций или виртуальных базовых классов
Не имеет нестатических элементов данных ссылочного типа
Все нестатические члены данных и базовые классы сами являются стандартными типами макетов
До C ++ 14:
Либо
не имеет базовых классов с нестатическими элементами данных, либо
не имеет нестатических элементов данных в наиболее производном классе и не более одного базового класса снестатические члены данных
не имеет базовых классов того же типа, что и первый нестатический элемент данных (см. пустую базовую оптимизацию)
Эта часть относится к этому примеру:
has no base classes with non-static data members,
В вашем случае у вас есть базовый класс с нестатическими членами данных.Удаление a
удаляет предупреждение.
После C ++ 14 существуют аналогичные ограничения, вы не можете иметь членов в двух классах, только один:
Имеет все нечлены статических данных и битовые поля, объявленные в одном классе (либо все в производном, либо все в некоторой базе)