Существует 2 вида
полиморфизма:
простой полиморфизм (статический), базирующийся на механизме
раннего связывания, и сложный полиморфизм (динамический), использующий механизм
позднего связывания. Простой полиморфизм поддерживается языком
C++ на этапе
компиляции (раннее связывание) и реализуется с помощью механизма переопределения функции. Эти
полиморфные функции в
C++ называются переопределенными. В соответствии с общими правилами они могут различаться типом возвращаемого параметра и сигнатурой ( количеством и типом передаваемых параметров ).
Динамический полиморфизм – выбор функции производится по используемому при выводе имени, типу вызываемого объекта и типу используемый параметров. Если объявленный тип не совпадает с типом использованного объекта, тип этого объекта идентифицируется и проверяется во время исполнения программы, что позволяет осуществить правильный выбор соответствующей функции. Это и называется
динамическим полиморфизмом (
поздним связыванием). Динамическое связывание приводит к небольшим издержкам памяти и времени выполнения программы, поэтому в
C++ его используют только в случае явного указания, посредством ключевого слова
virtual. Динамическое связывание используется путем объявления виртуальной функции.
Виртуальная функция может реализовываться алгоритмами, которые, как правило, отличаются между собой. Если коды функции различны, то механизм виртуальности не включается. При использовании виртуальной функции, каждый аспект виртуальной функции, вызываемой из базового
класса, определяется на этапе выполнения программы, когда известно для какого объекта вызван метод :
базового класса или производного. Если вызов функции осуществляется через
указатель на базовый класс, нужный аспект функции вызывается в зависимости от того, адрес объекта какого класса будет содержать указатель.
Пример 1
class Window
{
public:
Window(const Point &upper.Dest, const Point &size, const string &title);
~Window();
void move(const Point &new_upper_left);
Point upper_left() const;
Point lower_right() const;
virtual void change_size(const Point fnew_size);
//Если новый размер point меньше минимального, сократить до этого минимального размера
int move cursor(contst Point &where);
Point cursor() const;
Display char character()const;
string Tile() const;
void add(Display char c);
void add(const string &str);
void clear();
void scroll_up();
void scroll_down();
private:
//данные для Window
};
/* Функция collapse, которая использует только общие для всех типов окон функции, что обеспечивает возможность её применения для окон любого типа. */
void collapse(Window &w)
{
w.clear();
w.change_size(Point(5,5));
//метод изменения размера change.size
}
main(int argc, char *argv[])
{
window w(Point(10,6), Point(30,6), AWIndow);
shell_Window sw(Point(3, [1]), Point(10, 10), "A shell_window")
collapse(w);
collapse(sw);
return 0;
}