Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tekhnologia_Programmirovania_-_ekzamen.doc
Скачиваний:
0
Добавлен:
25.12.2019
Размер:
1.29 Mб
Скачать

7. Добавление, замещение и уточнение методов класса при наследовании.

Класс - это некое множество объектов, имеющих общую структуру и общее поведение.

Класс - опи­сание структуры и поведения объектов, связанных отношением общности.

Наследование - это такое отношение между классами, когда один класс повторяет структуру и поведение другого класса (одиночное наследование) или других (множественное наследование) классов.

Классы, экземпляры которых не создаются, называются абстрактными. Ожидается, что подклассы абстрактных классов доопределят их до жизнеспособной абстракции, наполняя класс содержанием.

Самый общий класс в иерархии классов называется базовым (суперклассом, родительским). В большинстве приложений базовых классов бывает несколько, и они отражают наиболее общие абстракции предметной области.

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

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

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

  • В производном классе можно переопределять методы базового класса (сохраняя точное совпадение с исходным прототипом, то есть количество и типы аргументов и возвращаемый тип). Исключение: если возвращаемый тип является указателем или ссылкой на базовый класс, он может быть заменен указателем или ссылкой на порождаемый класс.

  • Если в классе-наследнике имя метода и его прототип совпадают с именем метода базового класса, то метод производного класса скрывает (замещает) метод базового класса. Чтобы получить из подкласса доступ к методу суперкласса, используется оператор :: (разыменования).

  • Уточнение – уточняющий метод выполняет метод суперкласса и добавляет некоторые действия.

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

Существует два способа связывания (замещения) вызывающего и вызываемого методов:

  • Невиртуальное замещение – адрес методов определяется на момент трансляции кода.

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

Достоинства: скорость и эффективность.

  • Виртуальное замещение - адрес методов определяется на момент выполнения кода (позднее связывание).

Достоинство: универсальность.

Для определения типа объекта по указателю или ссылке во время выполнения программы в С++ используется динамическая идентификация типа данных (RTTI) (операторы dynamic_cast и typeid).

Механизм позднего связывания: когда разрешение ссылок на метод происходит на этапе выполнения программы в зависимости от конкретного типа объекта, вызвавшего метод. Адрес метода для определенного типа объекта выбирается из таблицы виртуальных методов (координирующей таблицы) - механизм динамического соответствия, используемый во многих языках программирования.

Обычно компилятор создает отдельную vtable для каждого класса. После создания объекта указатель на эту vtable, называемый виртуальный табличный указатель или vpointer, добавляется как скрытый член данного объекта. Компилятор также генерирует «скрытый» код в конструкторе каждого класса для инициализации vpointer'ов его объектов адресами соответствующей vtable.

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