Это были уже две разные функции (переопределение не меняет этого), но поскольку они имеют разную подпись, то в B
не не переопределяет в A
.
Помните, что имя функции является лишь частью ее идентичности!Его список параметров тоже имеет значение.
Если бы вы поставили ключевое слово override
на B::init()
, тогда ваша программа не смогла бы скомпилироваться, потому что B::init()
на самом деле ничего не перезаписывает (нет init()
(виртуально или иным образом, в своей базе).
С виртуальной таблицей действительно ничего не происходит, что также не произошло бы, если бы две функции буквально имели разные имена, такие как A::init(bool)
и B::urgleburgleboop()
.
Обратите внимание, что, помимо virtual
, полиморфизма и переопределения, B::init()
также "скрывает" A::init(bool)
для нормального разрешения перегрузки (спасибо, C ++!), И из-за этого Clang будет предупреждать васcode.
Что касается того, где вы можете прочитать об этом, ваша книга по C ++ будет хорошим началом.:)