Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
все билеты ооп.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
932.08 Кб
Скачать

Билет №6. Иерархии в объектно-ориентированной системе

Иерархия - упорядочение абстракций, расположение их по уровням. Абстракции образуют иерархии. Каждый из «нижних» уровней абстракции поддерживает абстракции более высокого уровня. На каждом уровне иерархии абстракций мы пользуемся абстракциями более низкого уровня. При этом для построения абстракций на каждом уровне нам нужны абстракции только «предыдущего» нижнего уровня, что позволяет исключить из рассмотрения более низкоуровневые и более высокоуровневые абстракции.

Примеры иерархий:

  • Иерархия классов - иерархия «являться» («is-a»)

  • Иерархия объектов – иерархия «быть частью» («part-of »)

  • Иерархии – частные случаи связи между объектами

  • Разные иерархии существуют независимо друг от друга, являются разными «плоскостями сечения» системы

Иерархия is-a: Наследование

  • Отношение (связь) между классами: «то» является «этим»

    • родитель/потомок

    • обобщение/специализация

  • Наследование с точки зрения С++ это повторное использование кода

  • Более общий класс – базовый класс, суперкласс, родитель

  • Более специализированный – производный класс, подкласс, наследник, потомок

Билет №7. Полиморфизм

Полиморфизм - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Например для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций.

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

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

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

Полиморфизм в C++ реализуется с помощью наследования, виртуальных функций и указателей на базовый класс.

Деструкторы и полиморфизм

// Деструктор – виртуальный поэтому вызывается через

// таблицу виртуальных функций и вызывает деструкторы

// базовых классов

При возможности полиморфного использования (то есть практически во всех нетривиальных случаях) деструктор класса необходимо объявлять виртуальным

Билет №8.Типы методов

Типы методов (Операций):

  • Селектор (инспектор) - Метод, считывающий состояние объекта, но не меняющий его

  • Модификатор (мутатор)

    • Метод, меняющий состояние объекта

  • Конструктор

    • Операция создания объекта и/или его инициализации

  • Деструктор

    • Операция, освобождающая состояние объекта и/или разрушающая сам объект

Конструкторы

(Конструктор по умолчанию, Конструктор копирования, Конструктор - инициализатор, Конструктор преобразования типа, Обязательные конструкторы)

  • Конструктор – метод создания и/или инициализации объекта

  • Конструктор – специальный метод, который

    • имеет то же имя, что и класс

    • не возвращает значений

    • вызывается непосредственно после выделения памяти

    • не может быть вызван явно

Когда вызывается конструктор:

  • При объявлении объекта:

Rational r;

Если объект глобальный, конструктор вызывается до функции main!

  • При динамическом создании объекта:

Rational* r = new Rational();

  • При присваивании значения не вызывается:

Rational r1, r2;

r1 = r2;

  • При передаче параметров между функцией и вызывающей ее программой если параметр передается по значению:

Rational DoSomething(Rational A);

Когда и какие конструкторы нужны:

  • Может ли быть класс без конструкторов?

    • Нет! Конструктор по умолчанию и конструктор копирования создаются автоматически

  • Автоматически созданный конструктор копирования копирует значения полей

  • Явные конструкторы копирования абсолютно необходимы, если класс имеет динамические поля

  • Все остальные конструкторы определяются исходя из соображений удобства использования

Конструкторы и наследование:

  • Конструктор класса-потомка должен вызывать конструктор прямого предка. При этом:

    • при отсутствии явного вызова конструктора предка неявно (автоматически) вызывается конструктор предка по умолчанию

    • при необходимости конструктор потомка может явно вызвать конструктор предка любого типа (но только один!)

    • конструктор предка должен быть указан в списке инициализации потомка

  • «Многоуровневый объект» конструируется «сверху-вниз» от предков к потомкам – сначала инициализация предков, затем потомков

Деструкторы

  • Деструктор — специальный метод, который вызывается перед освобождением памяти занимаемой объектом

  • Деструктор вызывается:

    • только неявно (автоматически) – при удалении объекта из стэка

    • при удалении динамического объекта:

Rational * c1 = new Rational();

delete c1;

  • Функции деструктора:

    • освобождение памяти, занимаемой динамическими полями объекта

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

  • Компилятор всегда автоматически создает «пустой» деструктор

  • В случае, если класс содержит поля-указатели, явное написание деструкторов является абсолютно необходимым

  • Явная реализация конструкторов и деструкторов является «хорошим тоном»

  • (Деструктор – виртуальный поэтому вызывается через

таблицу виртуальных функций и вызывает деструкторы

базовых классов )

Полиморфизм и деструктор

  • При возможности полиморфного использования (то есть практически во всех нетривиальных случаях) деструктор класса необходимо объявлять виртуальным

Модификаторы(мутаторы,mutator)

  • Модификатор – метод, меняющий состояние объекта.

  • Модификатор в C++ – это просто… метод

class Polygon{

Point* vertices;

public:

// . . .

void set_vertex(int index,const Point & val);

//. . . };

Селекторы(Инспекторы, константные методы)

  • Селекторы – методы, не меняющие состояние объекта

  • В C++ есть специальный синтаксис для селекторов снабжаются спецификатором const, который входит в сигнатуру метода

  • Компилятор в состоянии отследить, что метод-селектор не меняет поля объекта

  • Селекторы могут вызывать только селекторы (свои и включенных объектов)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]