Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
369164_46F07_otvety_na_bilety_po_oop_si.doc
Скачиваний:
44
Добавлен:
24.12.2018
Размер:
613.38 Кб
Скачать

38. Таблица виртуальных функций. Случаи, когда вызов виртуальной функции не будет виртуальным. Виртуальные деструкторы

Таблица виртуальных функций

При динамическом связывании во время выполнения программы вызовов виртуальной функции-элемента перенаправляется функции из соответствующего класса. Для этой цели используется таблица виртуальных функций, называемая vtable, которая реализована в виде массива, содержащего указатели на функции. Каждый класс, содержащий виртуальные функции, имеет таблицу vtable. Для каждой виртуальной функции класса в vtable включается указатель на функцию, используемую для объекта этого класса. Виртуальная функция, используемая в конкретном классе, может быть либо определена в нем, либо унаследована, непосредственно или косвенно, от стоящнго выше в иерархии базого класса.

Определенная в базовом классе виртуальная функция-элемент может быть замещена в произвольном классе, но произвольные классы не должны делать это в обязательном порядке. Это значит, что произвольный класс может использовать виртуальную функцию-элемент из базового класса, что будет отражено в vtable.

Каждый объект класса с виртуальными функциями содержит указатель на vtable своего класса. Этот указатель для программиста недоступен. Соответствующий указатель на функцию выбирается из vtable и разыменовывается; на этом завершается формирование вызова виртуальной функции во время выполнения программы. На просмотр vtable и разыменовывание указателя требуются незначительные ресурсы системы.

Случаи, когда вызов виртуальной функции не будет виртуальным

Тип виртуальной функции не может быть переопределен  в производных классах. Исключением является случай, когда возвращаемый тип виртуальной функции является указателем или ссылкой на порожденный класс, а виртуальная функция основного класса - указателем или ссылкой на базовый класс. В производных классах функция может иметь список параметров, отличный от параметров виртуальной функции базового класса. В этом случае эта функция будет не виртуальной, а перегруженной. При этом спецификатор virtual игнорируется. Вызов функций должен производиться с учетом списка параметров.

Виртуальные деструкторы

При использовании полиморфизма в работе с динамически выделенными объектами иерархии классов могут возникать трудности. Если объекты разрушаются при помощи операции delete с указателем на базовый класс, то вызывается деструктор базового класса. Это происходит независимо от типа объекта, на который ссылается указатель на базовый класс, и от того факта, что деструктор каждого класса имеет другое имя.

Имеется простое решение этой проблемы - деструктор базового класса объявляется виртуально. Это приведет к тому, что деструкторы всех производных классов будут виртуальными, даже если их имена отличаются от имени деструктора базового класса. И теперь, если объект в иерархии разрушается при помощи операции delete, а указатель, ссылающийся на объект, является указателем на базовый класс, вызывается деструктор соответствующего производного класса.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]