Описание слайда:
Подобного рода задачи возникают при необходимости продублировать большой набор объектов, хранящийся, например, в виде дерева. Одно из применений - в каком-нибудь графическом редакторе мы создавали чертеж из отрезков, фигур, строк и так далее. Все это - объекты разного типа, но они вполне могут быть наследниками одного базового класса, скажем, TElement, и все изображение хранится в виде связного списка указателей на этот базовый тип. Затем в какой-то момент мы хотим скопировать чертеж (например, для вывода на печать). Но про каждый из объектов мы знаем только то, что он является наследником TElement.
Подобного рода задачи возникают при необходимости продублировать большой набор объектов, хранящийся, например, в виде дерева. Одно из применений - в каком-нибудь графическом редакторе мы создавали чертеж из отрезков, фигур, строк и так далее. Все это - объекты разного типа, но они вполне могут быть наследниками одного базового класса, скажем, TElement, и все изображение хранится в виде связного списка указателей на этот базовый тип. Затем в какой-то момент мы хотим скопировать чертеж (например, для вывода на печать). Но про каждый из объектов мы знаем только то, что он является наследником TElement.
Таким образом, у нас возникает необходимость скопировать весь список с сохранением типов объектов, но самих типов мы не знаем.
Функции, которые помогают решить эту задачу, и называют виртуальными конструкторами.
Различают два вида виртуальных конструкторов - по умолчанию и копирующий. Означают эти термины то же, что и в случае обычных конструкторов. Конструктор по умолчанию создает "пустой" объект (такого же, как и у образца, типа). Копирующий конструктор еще и копирует во вновь созданный объект содержимое образца.
Делается это следующим образом: - в базовом классе определяются две виртуальные (в примере ниже это makeobject и copyobject), которые создают объект (copyobject еще и копирует в новый объект содержимое образца) и возвращают указатель на него: