Виртуальные методы. Полиморфизм.
Полиморфизм — один из важнейших механизмов ООП. Полиморфизм реализуется с помощью наследования классов и виртуальных методов.
Полиморфизм состоит в том, что с помощью одного и того же обращения к методу выполняются различные действия в зависимости от типа, на который ссылается указатель в каждый момент времени.
Рассмотрим пример иерархии классов, где каждый класс имеет метод с одним именем.
class Base
{
public:
void show()
{ cout<<"Родитель\n";
}
};
class derv1:public base
{public:
void show()
{ cout<<"Сын первый\n";
}
};
class derv2:public base
{public:
void show()
{ cout<<"Сын второй\n";
}
};
int main(int argc, char *argv[])
{
derv1 s1; derv2 s2;
Base *ptr;
ptr=&s1;
ptr->show();
ptr=&s2;
ptr->show();
…
Итак, классы derv1 и derv2 являются наследниками класса Base. В каждом из трех классов имеется метод show(). В main() созданы объекты порожденных классов s1 и s2 и указатель на класс Base. Затем адрес объекта порожденного класса мы заносим в указатель базового класса: ptr=&s1;
Какая же функция будет выполняться в следующей строке:
ptr->show(); Base::show( ) или derv1::show( )?
В этом случае компилятор выбирает метод удовлетворяющий типу указателя (Base::show()) .
Этот процесс называется ранним связыванием.
В C++ реализован механизм позднего связывания, когда разрешение ссылок на метод происходит на этапе выполнения программы в зависимости от конкретного типа объекта, вызвавшего метод. Этот механизм реализован с помощью виртуальных методов.
Для определения виртуального метода используется спецификаторvirtual, например:
class base
{
public:
virtual void show()
{ cout<<"base\n";
}
};
Этот процесс ,называется поздним связыванием.
Если в базовом классе метод определен как виртуальный, метод, определенный в производном классе с тем же именем и набором параметров, автоматическистановится виртуальным, а с отличающимся набором параметров — обычным.
Для каждого класса (не объекта!), содержащего хотя бы один виртуальный метод,
компилятор создает таблицу виртуальных методов (vtbl), в которой для каждого виртуального метода записан его адрес в памяти.
Рекомендуется делать виртуальными деструкторы для того, чтобы гарантировать правильное освобождение памяти из-под динамического объекта, объекта, поскольку в этом случае в любой момент времени будет выбран деструктор, соответствующий фактическому типу объекта.
Деструктор передает операции delete размер объекта.
Дата добавления: 2015-02-10; просмотров: 1077;