Рассмотрим следующую простую программу в качестве примера полиморфизма во время выполнения . Главное, что следует отметить в программе, это то, что функция производного класса вызывается с использованием указателя на базовый класс.
Идея состоит в том, что виртуальные функции вызываются в соответствии с типом экземпляра объекта, на который указывают или на который ссылаются, а не в соответствии с типом указателя или ссылки.
Другими словами, виртуальные функции разрешаются поздно, во время выполнения.
|
Выход:
In Derived
Какая польза?
Виртуальные функции позволяют нам создавать список указателей базового класса и вызывать методы любого из производных классов, даже не зная вида объекта производного класса.
Например: рассмотрим программное обеспечение для управления сотрудниками организации.
Пусть в коде есть простой базовый класс Employee , класс содержит виртуальные функции, такие как Повышение уровня () , передача () , повышение () и т. Д. Различные типы сотрудников, такие как Менеджер , Инженер и т. Д., Могут иметь свои собственные реализации виртуальных функций. присутствует в базовом классе Employee.
В нашем полном программном обеспечении нам просто нужно передать список сотрудников повсюду и вызывать соответствующие функции, даже не зная типа сотрудника. Например, мы можем легко повысить зарплату всем сотрудникам, просматривая список сотрудников. Каждый тип сотрудника может иметь свою собственную логику в своем классе, но нам не нужно беспокоиться о них, потому что, если метод подходяще относится к конкретному типу сотрудника, будет вызвана только эта функция.
|
Как и globalRaiseSalary () , может быть много других операций, которые можно выполнять со списком сотрудников, даже не зная типа экземпляра объекта.
Виртуальные функции настолько полезны, что более поздние языки, такие как Java, сохраняют все методы как виртуальные по умолчанию .
Как компилятор выполняет разрешение во время выполнения?
Для этой цели компилятор поддерживает две вещи:
- vtable: таблица указателей на функции, поддерживаемая для каждого класса.
- vptr: указатель на таблицу виртуальных, поддерживается на экземпляр объекта (см это для примера).
Компилятор добавляет дополнительный код в двух местах для поддержки и использования vptr .
1) Код в каждом конструкторе. Этот код устанавливает vptr создаваемого объекта. Этот код устанавливает vptr для указания на vtable класса.
2) Код с полиморфным вызовом функции (например, bp-> show () в приведенном выше коде). Где бы ни происходил полиморфный вызов, компилятор вставляет код, чтобы сначала искать vptr, используя указатель или ссылку на базовый класс (в приведенном выше примере, поскольку указанный или ссылочный объект имеет производный тип, доступ к vptr производного класса). После получения vptr можно получить доступ к vtable производного класса. Используя vtable , вызывается адрес производной функции класса show () и вызывается.
Является ли это стандартным способом реализации полиморфизма во время выполнения в C ++?
Стандарты C ++ не предписывают точно, как должен быть реализован полиморфизм во время выполнения, но компиляторы обычно используют незначительные изменения в той же базовой модели.
Викторина о виртуальных функциях .
Ссылки:
http://en.wikipedia.org/wiki/Virtual_method_table
http://en.wikipedia.org/wiki/Virtual_function
http://www.drbio.cornell.edu/pl47/programming/TICPP-2nd-ed-Vol-one-html/Frames.html
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Динамическая отправка метода или полиморфизм во время выполнения в Java
- Могут ли статические функции быть виртуальными в C ++?
- Можно ли встроить виртуальные функции?
- Могут ли виртуальные функции быть закрытыми в C ++?
- Виртуальные функции в производных классах
- Чистые виртуальные функции и абстрактные классы в C ++
- Массив в Python | Набор 1 (Введение и функции)
- Переслать список в C ++ | Комплект 1 (Введение и важные функции)
- Что происходит, когда виртуальная функция вызывается внутри не виртуальной функции в C ++
- Математические функции в Python | Набор 2 (логарифмические и степенные функции)
- Полиморфизм в C ++
- Математические функции в Python | Установите 1 (числовые функции)
- Разница между наследованием и полиморфизмом
- Виртуальная функция в C ++
- Виртуальный деструктор
0.00 (0%) 0 votes