logo search
ООП 2012

33) Полиморфное наследование. Сложный полиморфизм.

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

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

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

Как уже упоминалось выше, при использовании виртуальных функций

нужный аспект полиморфной функции, вызываемой из метода базового класса,

определяется на этапе выполнения, когда известно, для какого объекта вызван

метод: объекта базового класса или объекта производного. Аналогично, если

вызов функции осуществляется через указатель на базовый класс, нужный

аспект функции вызывается в зависимости от того, адрес объекта какого класса

будет содержать указатель.