Полиморфизм
В полиморфизме можно
выделить два аспекта.
Полиморфизм метода
Под полиморфизмом
метода можно понимать выполнение одного
и того же метода различным способом для
объектов разных классов в иерархии.
Обеспечивается эта возможность за счет
динамического связывания, которое
реализуется с помощью виртуальных
функций. Класс, содержащий виртуальные
функции называется полиморфным.
Синтаксически виртуальные функции
определяются со словом virtual
перед заголовком функции в описании
класса.
Для полиморфного
класса компилятор в случае создания
объекта класса в программе автоматически
гарнирует таблицу виртуальных функций
vtable содержащую список
адресов всех виртуальных функций класса.
Таблица генерируется одна на класс, не
зависимо от количества объектов
создаваемых в программе. У каждого
объекта компилятором добавляется
отдельные компонентные данные (поле)
предназначенные для хранения адреса
vtable своего класса, которая
заполняется конструктором в момент
создания объекта.
()
Вызов виртуальной
функции осуществляется с помощью цепочки
команд сгенерированных компилятором:
У объекта получить
адрес vtable
В vtable
получить адрес вызываемой виртуальной
функции
Перейти на точку
входа в функцию и выполнить ее программный
код.
Полиморфизм объектов
Под полиморфизмом
объектов можно понимать возможность
замены объекта одного класса объектом
другого класса. Для того чтобы замена
производилась корректно, необходимо:
Классы находились
в одной иерархии наследования
Классы были
полиморфны
Объекты создавались
динамически
В отношении объектов
c++ меняет правило
совместимости типов: производный класс
совместим по типу с любым из своих
предков.