АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Виртуальные методы. Полиморфизм

Читайте также:
  1. Абстрактные классы и чистые виртуальные функции. Виртуальные деструкторы. Дружественные функции. Дружественные классы.
  2. Виртуальные методы
  3. Виртуальные окна и редактор исходных текстов моделей
  4. Возможные и виртуальные перемещения
  5. Графические методы.
  6. Денежно-кредитная политика: понятие, цели, методы.
  7. Конкуренция: сущность, виды, методы.
  8. Контрастные и реактивные методы.
  9. Математические методы.
  10. Метод теории государства и права. Принципы научного познания. Общенаучные методы. Частнонаучные методы
  11. Особенности научного познания, его структура, формы и методы.

Полиморфизм — один из важнейших механизмов ООП. Полиморфизм реализуется с помощью наследования классов и виртуальных методов.

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

Рассмотрим пример иерархии классов, где каждый класс имеет метод с одним именем.

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 размер объекта.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)