Введение в наследование.
Управление доступом к базовому классу. Защищенные члены класса. Конструкторы, деструкторы и наследование. Множественное наследование. Виртуальные базовые классы. Виртуальные функции. Указатели на производные классы. Знакомство с виртуальными функциями. Применение полиморфизма.
Какие две роли выполняет наследование?
Какие виды наследования возможны в С++?
Чем отличается модификатор доступа protected от модификаторов private и public?
Чем открытое наследование отличается от закрытого и защищенного?
Какие функции не наследуются?
Сформулируйте правила написания конструкторов в производном классе.
Каков порядок вызова конструкторов? А деструкторов?
Можно ли в производном классе объявлять новые поля? А методы?
Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен?
Что происходит, если имя метода-наследника совпадает с именем базового метода?
Объясните, зачем нужны виртуальные функции.
Что такое связывание?
Чем «раннее» связывание отличается от «позднего»?
Дайте определение полиморфного класса.
Может ли виртуальная функция быть дружественной функцией класса?
Наследуются ли виртуальные функции?
Каковы особенности вызова виртуальных функций в конструкторах и деструкторах?
Можно ли сделать виртуальной перегруженную операцию, например, сложение?
Может ли конструктор быть виртуальным? А деструктор?
Как объявляется «чистая» виртуальная функция?
Дайте определение абстрактного класса.
Наследуются ли чистые виртуальные функции?
Назначение наследования состоит в том, чтобы:
создавать более общие классы в более специализированных;
передавать аргументы объектам классов;
добавлять возможности к существующим классам без их модифика- ции;
улучшать сокрытие данных и их инкапсуляцию.
Класс-наследник называется_______ от базового класса.
Преимущество использования наследования заключается в:
обеспечении развития класса путем естественного отбора;
облегчении создания классов;
избежании переписывания кода;
предоставлении полезной концептуальной основы.
Напишите первую строку описания класса Bosworth, который является public-производным класса Alphonso.
Будет ли правильным утверждение: создание производного класса требует коренных изменений в базовом классе?
Члены базового класса для доступа к ним методов производного класса должны быть объявлены как public или_________ .
Пусть базовый класс содержит метод basefunc(), а производный класс не имеет метода с таким именем. Может ли объект производного класса иметь доступ к методу basefunc()?
Допустим, что класс, описанный в вопросе 4, и класс Alphonso содержат метод alfunc(). Напишите выражение, позволяющее объекту BosworthObj класса Bosworth получить доступ к методу alfunc().
Истинно ли следующее утверждение: если конструктор производного класса не определен, то объекты этого класса будут использовать конструкторы базового класса?
Допустим, что базовый и производный классы включают в себя методы с одинаковыми именами. Какой из методов будет вызван объектом производного класса, если не использована операция разрешения имени?
Напишите объявление конструктора без аргументов для производного класса Bosworth из вопроса 4, который будет вызывать конструктор без ар- гументов класса Alphonso.
Оператор разрешения обычно:
ограничивает видимость переменных для определенных методов;
обозначает, от какого базового класса создан производный;
определяет отдельный класс;
разрешает неопределенности.
Истинно ли следующее утверждение: иногда полезно создать класс, объектов которого никогда не будет создано?
Предположим, что существует класс Derv, производный от базового класса Base. Напишите объявление конструктора производного класса, принимающего один аргумент и передающего его в конструктор базового класса.
Предположим, что класс Derv является частным производным класса Base. Мы определяем объект класса Derv, расположенный в функции main(). Через него мы можем получить доступ к:
членам класса Derv, объявленным как public;
членам класса Derv, объявленным как protected;
членам класса Derv, объявленным как private;
членам класса Base, объявленным как public;
членам класса Base, объявленным как protected;
членам класса Base, объявленным как private.
Истинно ли следующее утверждение: класс D может быть производным класса C, который в свою очередь является производным класса B, который производный класса A?
Иерархия классов:
показывает те же взаимоотношения, что и схема организации;
описывает взаимоотношение типа «имеет»;
описывает взаимоотношения типа «является частью»;
показывает те же взаимоотношения, что и наследственное дерево.
Предположим, что класс Derv является производным класса Base. Оба класса содержат метод func() без аргументов. Напишите выражение, входящее в метод класса Derv, которое вызывает метод func() базового класса.
Истинно ли следующее утверждение: невозможно сделать объект одного класса, членом, другого класса?
Виртуальные функции позволяют:
создавать массивы типа «указатель на базовый класс», которые могут содержать указатели на производные классы;
создавать функции, к которым никогда не будет доступа;
группировать объекты разных классов так, чтобы они все были доступны с помощью одного и того же вызова функции;
использовать один и тот же вызов функции для выполнения методов объектов, принадлежащих разным классам.
Истинно ли утверждение о том, что указатель на базовый класс может ссылаться на объекты порожденного класса?
Пусть указатель р ссылается на объекты базового класса и содержит адрес объекта порожденного класса. Пусть в обоих этих классах имеется невиртуальный метод ding(). Тогда выражение p->ding(); поставит на выполнение версию функции ding() из__________класса.
Напишите описатель для виртуальной функции dang(), возвращающей результат типа void и имеющей аргумент типа int.
Принятие решения о том, какая именно функция будет выполняться по конкретному вызову функции, называется___________________.
Пусть указатель р ссылается на объекты базового класса и содержит адрес объекта порожденного класса. Пусть в обоих этих классах имеется виртуальный метод ding(). Тогда выражение p->ding(); поставит на выполнение версию функции ding() из_____________ класса.
Напишите описатель чистой виртуальной функции aragorn, не возвращающей значений и не имеющей аргументов.
Чистая виртуальная функция — это виртуальная функция, которая:
делает свой класс абстрактным;
не возвращает результата;
используется в базовом классе;
не имеет аргументов.
Напишите определение массива parr, содержащего 10 указателей на объекты класса dong.
Абстрактный класс используется, когда:
не планируется создавать порожденные классы;
есть несколько связей между двумя порожденными классами;
с его помощью запрещено создавать какие-либо объекты;
вы хотите отложить объявление класса.
