Наследование – процесс, с помощью которого один объект приобретает свойства другого, т.е. поддерживается иерархическая классификация.
Механизм позднего наследования:
Для каждого класса (не объекта!), содержащего хотя бы один виртуальный метод, компилятор создает таблицу виртуальных методов (vtbl), в которой для каждого виртуального метода записан его адрес в памяти. Адреса методов содержатся в таблице в порядке их описания в классах. Адрес любого виртуального метода имеет в vtbl одно и то же смещение для каждого класса в пределах иерархии.
Каждый объект содержит скрытое дополнительное поле ссылки на vtbl, называемое vptr. Оно заполняется конструктором при создании объекта (для этого компилятор добавляет в начало тела конструктора соответствующие инструкции).
На этапе компиляции ссылки на виртуальные методы заменяются на обращения к vtbl через vptr объекта, а на этапе выполнения в момент обращения к методу его адрес выбирается из таблицы. Таким образом, вызов виртуального метода, в отличие от обычных методов и функций, выполняется через дополнительный этап получения адреса метода из таблицы. Это несколько замедляет выполнение программы.
Поскольку объекты с виртуальными функциями должны поддерживать и таблицу виртуальных функций, то их использование всегда ведет к некоторому повышению затрат памяти и снижению быстродействия программы. Если вы работаете с небольшим классом, который не собираетесь делать базовым для других классов, то в этом случае нет никакого смысла в использовании виртуальных функций.
Конструкторы позволяют выделить память под объект класса и инициализировать его. Деструкторы наоборот очищают память от объектов класса.
Для базового класса, если он не абстрактный, нужно создавать конструкторы и деструкторы. при этом все потомки этого класса должны иметь свои собственные конструкторы по умолчанию, копирования и с параметрами и деструкторы, для некоторых из которых в определенных ситуациях нужно описать тело.