В приведенном ниже коде почему размер D равен 16 вместо 8 байт?
В любом случае все эти производные классы не могут (практически (*)) иметь такой же размер, каких виртуальная база A
:
- отношение объекта производного класса к не виртуальному непосредственному базовому подобъекту, как и отношение с подобъектом-членом, отношение один к одному;
- отношение объекта производного класса к виртуальному базовому подобъекту является отношением много к одному: по определению конкретный виртуальный базовый подобъект может быть прямой базой из нескольких производных классов. Здесь субобъект
A
является прямой базой подобъектов B
и C
объекта D
(или подобъекта еще одного производного объекта).
(*) Iзнаю, что существуют возможные методы реализации, которые нарушают это утверждение, но они намного менее эффективны, неуклюжи и труднее сделать потокобезопасными, и даже менее эффективны в многопоточных программах.
Поскольку отношение много к одному,макет класса не может быть исправлен (в отличие от не виртуального члена или члена). Расположение уникального базового подобъекта зависит от точного созданного производного класса.
A (g) Значение класса X
относится к экземпляру типа X
или классу, производному от X
;поэтому при использовании такого (g) lvalue, которое не ссылается на известный объект (при использовании имени локально объявленного объекта тип по определению известен), адрес базового подобъекта определяется во время выполнения от типа (или адреса)) информация, встроенная в экземпляр.
Таким образом, B
и C
должны нести такую информацию для определения местоположения виртуальной базы. Это делает их больше, чем их база. Самому производному классу требуется место для информации о расположении во всех не виртуальных базах, плюс сама виртуальная база (обычно помещается в конце, если в ней есть какие-либо элементы данных).