То, что вы не можете создать экземпляр класса A
напрямую, не означает, что создать экземпляр класса A
невозможно. Вам не разрешено создавать экземпляр A
, потому что компилятор знает, что A
является абстрактным, и отклоняет любой написанный вами код, который пытается напрямую создать экземпляр A
. Это запрещает код, подобный этому:
A a;
new A();
Что делает класс абстрактным, так это то, что он имеет чисто виртуальные методы. Тем не менее, ничто не мешает созданию такого класса. Стандарт C ++ просто говорит, что это запрещено. Компилятор вполне способен генерировать инструкции для создания экземпляра абстрактного класса. Все, что ему нужно сделать, - зарезервировать нужное количество памяти и затем вызвать конструктор, так же, как это было бы для неабстрактного класса.
Когда вы создаете экземпляр B
, вся память для класса выделяется сразу. Поскольку все байты есть, там, по сути, есть экземпляр A
, готовый для инициализации конструктором. (Но обратите внимание, что память формально не считается объектом типа A
до тех пор, пока после не завершится работа конструктора A
.) Запустится конструктор A
, а затем конструктор B
пробеги.