C
, будучи потомком обоих, - это A
, а - это B
.Таким образом, когда вы отклоняете указатель, среза не происходит (почему бы это все равно?), Но указатель указывает на соответствующую часть объекта.Стандартной схемой будет что-л.как
c -> +++++++++++++++++++++
+ C +
a -> + +++++++++++++++++ +
+ + A + +
+ +++++++++++++++++ +
+ +
b -> + +++++++++++++++++ +
+ + B + +
+ +++++++++++++++++ +
+ +
+ C's own members +
+ +
+++++++++++++++++++++
Оба a
и b
указывают на соответствующие подобъекты.
Откуда он знает? - Ну, компилятор создает макеты памяти,он определенно знает, каким виртуальным адресам должны быть назначены указатели, и как увеличение / уменьшение равно смещению указателя.
Обратите внимание, что при использовании простого указателя на базу в качестве единственной (и владеющей) ссылки наобъект, вы должны объявить деструктор базы virtual
, иначе вы не сможете должным образом уничтожить объект.