Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольные вопросы + ответы.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
323.07 Кб
Скачать
  1. Дружественные функции.

Данную операцию можно рассматривать не как запрос объекту, а как действие над ним. В этом случае правильный подход – реализация в виде функции, а не метода класса. Проблема: инкапсуляция и необходимость доступа к закрытым членам. Решение – определение дружественной функции. Объявление дружественной функции в определении класса: friend тип имя(параметры);

Дружественная функция является частью интерфейса класса. Поэтому она не нарушает инкапсуляции. Расширенные права ей делегирует класс, а не его пользователи. Дружественными могут быть целые классы или отдельные методы классов.

  1. Понятие полиморфизма в программировании. Виды полиморфизма в языке С++

Полиморфизм. Одно и тоже имя можно использовать для обозначения

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

Основной принцип: один интерфейс, множество методов. Выбор конкретного действия выполняется автоматически одним из двух способов:

– на этапе компиляции (статический полиморфизм)

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

– на этапе выполнения программы (динамический полиморфизм).

Проявления полиморфизма в C++: перегрузка функций и методов, перегрузка операторов, виртуальные методы, шаблоны.

  1. Иерархические отношения между классами: композиция.

class Composite {

public:

Composite(списокПараметров);

~Composite();

//...

private:

Class_1 b1;

Class_2 b2;

//...

Class_k bk;

};

Composite::Composite(списокПараметров)

: b1(список1), b2(список2), ... bk(списокk) {}

  1. Иерархические отношения между классами: наследование.

//определение производного класса

class имяПроизводного : доступ имяБазового {

//объявление новых методов и переменных состояния

};

//определение конструктора

имяПроизводного::имяПроизводного(параметры)

: имяБазового(параметрыБазового)

{

//тело конструктора

}

  1. Виртуальные методы и позднее связывание.

Раннее связывание – определение адреса вызываемой функции во время компиляции программы.

Позднее связывание – определение адреса вызываемой функции во время выполнения программы.

Сам процесс связывания заключается в замене виртуальных функций на адреса памяти.

При позднем связывании адрес функции определяется по типу объекта,

для которого осуществляется вызов через указатель.

Позднее связывание применяется для виртуальных (полиморфных) методов.

Синтаксис объявления метода виртуальным: virtual объявлениеМетода;

class Ancestor

{

public:

virtual void function1 () { cout << "Ancestor::function1()" << endl; }

void function2 () { cout << "Ancestor::function2()" << endl; }

};

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

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

void destroy (Viewer *viewer)

{

//подготовительные действия

//...

delete viewer;

return;

}