Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVETY_K_EKZAMENU_PO_OOP.doc
Скачиваний:
10
Добавлен:
01.07.2025
Размер:
239.62 Кб
Скачать

23. Переопределение функций в производном класе. Вирт-ые функции.

C++ поддерживает virtual функции-члены, кот объявлены в основном класе и переопределены в порожденом класе. Иер-я класов, определеная общим насл-ем, создает связаный набор типов юзера, на кот можно сылаться с помощью указателя баз класса. При обращении к вирт-ой функции через этот указатель в C++ выбирается соответствующее функциональное определение во время выполнения. 0бъект, на кот указывается, должен содержать в себе информацию о типе, т. к. различия между ними может быть сделано динамически. Каждый объект "знает" как на него должны воздействовать. Эта форма полиморфизма назется чистым полиморфизмом и явл наиболее общим и гибким способом формирования програмного обеспечения. При переопределении в производном класе вирт функция может(должна) иметь ту же сигнатуру и тип возврата, что и в базовом типе. Вирт-ые функции могут быть перегружены. Если функция определена как virtual, то это св-во передается всем переопределениям в производных класах. В производном класе можно не использовать модификатор virtual. т. к. при разработке производных класов переопределяется исключительно вирт-ые функции, то желательно этот модификатор не опускать, т. к. прог-исту придется в таком случае просматривать всю иер-ю класов для определения, явл даная функция вирт-ой или нет. 0чень часто в теле вирт-ой функции приходится осуществлять вызов функции из баз класса. Для этого необходимо использовать оператор разрешения контекста :: в виде: ИмяБазКласа::ИмяФункции(арг-ты)

24. 0Ператор разрешения контекста.

оператор разрешения контекста :: в виде: ИмяБазКласа::ИмяФункции(арг-ты). 0ператор разрешения контекста, сообщает компилятору, что надо воспользоваться областью видимости класса. Функция-член одного класса может быть friend-функцией другого класса. Это происходит тогда, когда функция-член объявлена в friend класе с исп-нием оператора разрешения контекста для определения имени функции друж-веного класса. 0беспечивает обращение к именованой глобальной области памяти, находящейся вне области видимости. Эта операция применяется при работе с одноимёными объектами, расположеными во вложеных областях действия имён. Когда объект во внутреней области действия имени скрывает одноименый объект, областью действия которого явл файл.Не следует испытывать никаких илюзий относительно возможностей этой операции. Операция обеспечивает доступ лишь к глобальным, естествено, ранее объявленым объектам, независимо от степени вложености области действия. Поэтому она не обладает св-вом транзитивности. Выражения вида ::(::(::m)) воспринимаются транслятором как ошибочные.

25. Приведение типов объектов.

Наиболее идеальный случай применения методов 00П заключается в использовании только вирт-ых методов. К сожалению, практически всегда, производные классы содержат в себе новые даные и методы. В этом случае необходимо определить фактический тип объекта. Если прог-ист точно знает этот тип (класс), то он может воспользоваться приведением. Но компилятор не контролирует подобное приведение типов. Случайно в объекте могут оказаться нужные участки памяти, кот будут ошибочно заполнены и ошибки в момент заполнения не будут замечены. Затем, с большой вероятностью, ошибочные даные могут быть обнаружены через значительный промежуток времени, что сильно затруднит поиск источника ошибки. Динамическая идентификация типа (run-time type identification - RTTI) предоставляет механизм для безопасного выявления типа объекта, на кот направлен во время выполнения проги указатель баз класса. Этот механизм включает dynamic_cast — операцию над указателем баз класса. Вызов dynamic_cast: dynamic_cast<тип> (ИдентификаторУказателя0бъекта). где тип должен быть указателем или сылкой на класс, а ИдентификаторУказателя0бъекта - преобразуемый указатель (ссылка) на экземпляр класса. Это приведение используется только с класами, имеющими вирт-ые функции. Если преобразование неприменимо, то возвращается нулевой указатель NULL. Пример. Пусть имеется следующее описание: intarray *b; Написать фрагмент проги, кот проводит сортировку только в том случае, когда фактический тип объекта есть intsortedarray (или его произ класс). Решение:

intsortedarray *w=dynamic_cast<intsortedarray*>(b); if (w) w->setsorted(true);