Скачиваний:
316
Добавлен:
28.03.2021
Размер:
378.53 Кб
Скачать

46.Указатели и ссылки на производные типы. Понятие и сравнение раннего связывания с поздним.

В С++ указатель на базовый класс может указывать на объект производного класса, полученного из этого базового класса. Предположим, например, что имеется базовый класс B_class и его производный класс D_class. В С++ любой указатель типа B_class* может также указы­вать на объект типа D_class. Например, если имеются следующие объявления переменных: B_class *р; // указатель на объект типа B_class B_class B_ob; // объект типа B_class D_class D_ob; // объект типа D_class

, то следующие присвоения абсолютно законны: р = &В_оb; // р указывает на объект типа B_class р = &D_ob; // р указывает на объект типа D_class, являющийся объектом, порожденным от B_class

Используя указатель р, можно получить доступ ко всем членам D_ob, которые наследованы от B_ob. Однако специфические члены D_ob не могут быть получены с использованием указателя р (по крайней мере до тех пор, пока не будет осуществлено приведение типов). Это является след­ствием того, что указатель «знает» только о членах базового типа и не знает ничего о специфи­ческих членах производных типов.

Если необходимо получить доступ к элементам производного класса с помощью указателя, имеющего тип указателя на базовый класс, необходимо воспользоваться приведением типов. На­пример, в следующей строке кода осуществляется вызов функции show_phone() класса D_ob: ((D_class *)р) ->show_phone(); Внешние скобки необходимы для того, чтобы ассоциировать приведение типа именно с указате­лем р, а не с возвращаемой величиной функции show_phone().

В C++ эти термины связывают с событиями, которые происходят во время компиляции и в период выполнения программы соответственно. При раннем связывании вызов функции подготавливается во время компиляции, а при позднем — во время выполнения программы. Раннее связывание означает, что вся информация, необходимая для вызова функции, известна при компиляции программы. Примерами раннего связывания могут служить стандартных функций и вызовы перегруженных функций (обычных и операторных).Из принципиальных достоинств раннего связывания можно назвать эффективность: оно работает быстрее позднего и часто требует меньших затрат памяти. Его основной недостаток — отсутствие гибкости.

Позднее связывание означает, что точное решение о вызове функции будет принято во время выполнения программы. Позднее связывание в C++ достигается за счет использования виртуальных функций и производных типов. Преимущество позднего связывания состоит в том, что оно обеспечивает большую степень гибкости. Его можно применять для поддержки общего интерфейса и разрешать при этом различным объектам, которые используют этот интерфейс, определять их собственные реализации. Более того, связывание может помочь программисту в создании библиотек классов, характеризующихся многократным использованием и возможностью расширяться. Но к его недостаткам можно отнести, хотя и незначительное, но все же понижение скорости выполнения программ.