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