На этом шаге мы рассмотрим понятие полиморфизма.
Полиморфизм - это третий принцип, лежаший в основе создания класса. При полиморфизме (дословно: многоформие) родственные объекты (т. е. происходящие от общего родителя) могут вести себя по-разному в зависимости от ситуации, возникающей в момент выполнения программы. Чтобы добиться полиморфизма, надо иметь возможность один и тот же метод в классе-родителе переопределить в классе-потомке.
Например, все классы имеют общего прародителя - класс Object. В этом классе определен метод draw (рисовать фигуру). Классы, рисующие различные фигуры и произошедшие от Object, - родственные классы. Каждый них определяет рисование своей фигуры методом draw, унаследованным от Object: точку, линию, прямоугольник, окружность и т. д. Но все фигуры разные, хотя метод общий. Но этот метод draw в каждом из классов-потомков переопределен, т. е. в каждом классе-потомке ему назначена другая функциональность.
Полиморфизм достигается за счет того, что методам из класса-родителя позволено выполняться в классе-потомке, а там оставляют только его имя, но при этом дают ему необходимую для данного класса функциональность. Такие методы должны объявляться в обоих классах с атрибутом virtual, записываемым перед атрибутом "возвращаемый тип данных". Если функция имеет атрибут virtual, то она может быть переопределена в классе-потомке даже если количество и тип ее аргументов такие же, что и у функции базового класса. Переопределенная функция отменяет вызов функции базового класса.
Кроме атрибута virtual, у методов существует атрибут friend. Методы с таким атрибутом, расположенным (как и атрибут virtual) в объявлении метода перед указанием типа возвращаемых данных, называются дружественными. Метод, объявленный с атрибутом friend, имеет полный доступ к членам класса, расположенным в секциях private и protected, даже если эте метод - не член этого класса. Это справедливо и для классов: внешний класс (т. е. его методы) имеет полный доступ к классу, который объявляет этот внешний класс дружественным.
Во всех остальных аспектах дружественный метод - это обычный метод. Подобные методы из внешних классов, имея доступ к секциям private и protected, могут решать задачи, реализация которых с помощью методов членов данного класса затруднительна или даже невозможна.
На следующем шаге мы рассмотрим примеры программ, использующих классы.