
- •1. Понятие 00п. Причины появления 00п.
- •2. Инкапсуляция св-в объекта
- •3. Насл-е св-в
- •4. Полиморфизм поведенческих св-в объектов
- •5. Роль типов даных в яп
- •6. Этапы 00п.
- •8. Заголовочные файлы.
- •10. Константы, парамы по умолчанию.
- •11. Ссылки.
- •12. Перегрузка функций.
- •13. Классы и объекты.
- •14. Члены класса.
- •15. 0Писание класов.
- •16. Конст-ры, деструкторы.
- •17. Конст-р копирования, Конст-р присваивания.
- •18. Друзья класса.
- •19. 0Бъекты с автоматически распределяемой памятью.
- •20. 0Бъекты с динамически распределяемой памятью
- •21. Производные классы: одиночное насл-е.
- •22. Модификаторы доступа.
- •23. Переопределение функций в производном класе. Вирт-ые функции.
- •24. 0Ператор разрешения контекста.
- •25. Приведение типов объектов.
- •26. Абстр-ые классы. Чисто вирт-ые функции.
- •27. Множвеное насл-е. Сравнение множвеного насл-я с одиночным.
- •28. "Правильное" множвеное насл-е. Понятие интерфейса.
- •29. Парамизованые классы.
- •30. Парамизованые функции.
- •31. Перегрузка операций. Перегрузка унарных операторов.
- •32. Перегрузка операций. Перегрузка бинарных операторов.
- •33. Исключения и их обработка.
- •34. 0Бщая характеристика стандартной библиотеки шаблонов.
- •35. Ввод-вывод с исп-нием потоков stl.
- •46. Классы Control, ScrollableControl, ContainerControl.
- •47. Классы WinForms Application, Screen.
- •48. Классы-контейнеры List, ArrayList.
- •49. Классы Pen, Brush, Font, Graphics.
- •50. Класс Form.
- •51. Классы WinForms для реализации кнопок.
- •52. Классы WinForms для реализации строк редактирования.
- •53. Классы WinForms для реализации списков и выпадающих списков.
- •54. Классы WinForms для реализации меню и инструментальных панелей
- •55. Классы WinForms для реализации контейнеров управляющих элементов.
- •56. Методика работы с диалоговыми окнами.
- •57. Сериализация, десериализация.
- •58.Разработка компонентов.
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);