Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






TPoint *data[N]; // массив фигур. Если в базовом классе метод определен как виртуальный, метод, определенный в производном классе с тем же именем и набором параметров




void ShowAll();

};

void TPlane::ShowAll() {

for (int i=0; i<n; i++)

data[i]->Show();

}

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

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

Если виртуальный метод переопределен в производном классе, объекты этого класса могут получить доступ к методу базового класса с помощью операции доступа к области видимости.

TCircle C(1, 2,3);

C.TPoint::Show();

Виртуальный метод не может объявляться с модификатором static, но может быть объявлен как дружественный.

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

При доступе через объект, а не через указатель виртуальность не работает.

Пример:
TPoint p[20]; p[2].Show(); // вызывается TPoint::Show()

Виртуальность не работает в конструкторе класса.

Для работы механизма позднего связывания создается специальная “Таблица виртуальных методов” (vtbl).

Для каждого класса (не объекта!), содержащего хотя бы один виртуальный метод, компилятор создает таблицу виртуальных методов (vtbl), в которой для каждого виртуального метода записан его адрес в памяти.

Адреса методов содержатся в таблице в порядке их описания в классах.

Адрес любого виртуального метода имеет в vtbl одно и то же смещение для каждого класса в пределах иерархии.

Каждый объект содержит скрытое дополнительное поле ссылки на vtbl, называемое vptr. Оно заполняется конструктором при создании объекта (для этого компилятор добавляет в начало тела конструктора соответствующие инструкции).

На этапе компиляции ссылки на виртуальные методы заменяются на обращения к vtbl через vptr объекта, а на этапе выполнения в момент обращения к методу его адрес выбирается из таблицы. Таким образом, вызов виртуального метода, в отличие от обычных методов и функций, выполняется через дополнительный этап получения адреса метода из таблицы. Это несколько замедляет выполнение программы.

Виртуальность отрицательно сказывается на быстродействии программы, поэтому методы имеет смысл делать виртуальными тогда и только тогда, когда это действительно необходимо
(см. пример).






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных