Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Плата за полиморфизм

Наследование классов | Применение наследования | Использование объектов производного класса в качестве объектов базового класса | Dynamic_cast <тип *> (выражение). | Информация о типе во время выполнения (RTTI) (лучше почитать после обсуждения виртуальных функций). | Конструкторы, деструктор и перегрузка опрации присваивания в производном классе. | Множественное наследование |


Читайте также:
  1. Б) заработная плата работников отдела реализации;
  2. В. 8. Оплата и стимулирование труда РСС.
  3. Визначення часу відпочинку. Види відпочинку. Оплата праці.
  4. Визуальное объектно-ориентирование программирование. Инкапсуляция, наследование, полиморфизм. Основные объекты и их свойства, методы и события
  5. Виртуальные метода и полиморфизм.
  6. Возможна оплата в российских рублях.
  7. Г) не справляється плата до вступу їх у пору плодоношення.

 

Для реализации динамического связывания компилятор генерирует таблицу виртуальных функций (иногда кратко говорят виртуальную таблицу, vtable) для каждого класса, имеющего хотя бы одну виртуальную функцию. Виртуальная таблица класса содержит массив (или односвязный список) указателей на адреса кода виртуальных функций для конкретного класса. Каждый класс с хотя бы одной виртуальной функцией имеет скрытое поле данных (например, __vtbl), которое указывает на упомянутый выше массив указателей на функцию. Каждый производный класс имеет копию этой таблицы. Тем самым, в каждый объект этого класса добавляется при создании еще один член: указатель на виртуальную таблицу класса, иногда называемый виртуальным указателем. (Когда объект создается, компилятор устанавливает его __vtbl - указатель на vtable его динамического класса. Вызов виртуальной функции компилируется в индекс для этой таблицы и в обращение к функции по этому индексу.). Каждый экземпляр класса (объект) совместно использует (shares – разделяет) общую для них таблицу. Каждый элемент (вход) таблицы указывает на функцию базового класса, или, если функция переопределена (замещена), на функцию производного класса. Любая новая виртуальная функция, которую объявляет производный класс, добавляется в конец таблицы. Когда виртуальная функция вызывается для объекта класса, программа использует виртуальный указатель объекта для отыскания виртуальной таблицы этого класса. Затем, виртуальная таблица просматривается, чтобы найти указатель на вызванную виртуальную функцию. Этот указатель, в конечном счете, приводит программу к коду нужной (верной) функции.

Множественное наследование слегка усложняет дело, но основная концепция остается прежней: косвенный доступ через таблицу указателей.


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

 

Поскольку, когда виртуальная функция вызывается, программа должна “пройти” через два указателя, прежде, чем достигнет кода функции, скорость выполнения вызова будет приблизительно на 15% меньше, чем при обычном вызове

 

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

 


Дата добавления: 2015-11-16; просмотров: 50 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Виртуальные функции| Абстрактные базовые классы и чисто виртуальные функции

mybiblioteka.su - 2015-2024 год. (0.006 сек.)