Расположение объектов в памяти только частично указано в стандарте C ++, однако существуют определенные соглашения, которые использует большинство компиляторов. Пустые типы будут занимать немного памяти (так что у них будет адрес памяти, который будет указывать их указатели). Этот дополнительный бит памяти обычно составляет всего четыре байта, в большинстве случаев не о чем беспокоиться. Если вы наследуете от пустого типа с другой стороны, это не должно увеличивать размер вашего объекта, потому что остальная часть объекта будет занимать пространство, поэтому у него все равно будет адрес.
Если вы используете объекты одиночного наследования, они будут размещены с первым битом памяти, размещенным как первый базовый класс, а затем с памятью для хранения членов более поздних классов в цепочке. Если у вас есть какие-либо виртуальные функции, там также будет место, возможно, в начале, для виртуального указателя. Если вы производите один тип от другого, вы, как правило, хотите следовать «правилу трех»: виртуальный деструктор, конструктор копирования и оператор присваивания копии. Итак, у вас будет виртуальный указатель, опять же, это, вероятно, 4 байта, ничего страшного.
Если вы получаете множественное наследование, ваши объекты начинают очень усложняться структурно. Они будут иметь различные указатели на разные части себя, чтобы функции могли найти членов, которых они ищут.
Тем не менее, подумайте, хотите ли вы использовать наследование для моделирования этого вообще. Возможно, было бы неплохо дать объектам переменную-член bool.