Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС_ответы.doc
Скачиваний:
35
Добавлен:
27.10.2018
Размер:
21.59 Mб
Скачать

19 Ооп. Поняття перевантаження операцій. Правила її використання.

Перегрузка операций строится на основе общедоступных (public) статических (вызываемых от имени класса) функций-членов с использованием ключевого слова operator.

Не все операции множества могут быть переопределены (перегружены) подобным образом. Некоторые операции могут перегружаться с ограничениями.

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

+, –, !, ~, ++, ––, true, false

Унарные символы операций, допускающие перегрузку. true и false также являются операциями

+, –, *, /, %, &, |, ^, <<, >>

Бинарные символы операций, допускающие перегрузку

==, !=, <, >, <=, >=

Операции сравнения перегружаются

&&, ||

Условные логические операции моделируются с использованием ранее переопределенных операций & и |

[]

Операции доступа к элементам массивов моделируются за счет индексаторов

()

Операции преобразования реализуются с использованием ключевых слов implicit и explicit

+=, –=, *=, /=, %=, &=, =, ^=, <<=, >>=

Операции не перегружаются, по причине невозможности перегрузки операции присвоения

=, ., ?:, –>, new, is, sizeof, typeof

Операции, не подлежащие перегрузке

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

  • префиксные операции ++ и –– перегружаются парами;

  • операции сравнения перегружаются парами: если перегружается операция ==, также должна перегружаться операция !=. То же самое относится к парам < и >, <= и >=.

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

Если функция operator является членом класса, то она один из аргументов получает неявно с помщбю открытого указателя this. Если не являеться членом класса- аргумент указывается явно.

При перегрузке операций () [] =

Функция operator должна быть членом класса. Если функция operator является членом класса, то левый операнд должен быть объектом или ссылкой на объект этого класса.

Если необходимо, чтобы левый операнд был объектом другого класса или вовсе не объектом, то operator следует сделать дружественной функцией .

20 Ооп. Наслідування. Поняття базового та похідного класів. Спеціфікатори доступу до членів класів.

Насле́дование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.

Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса .

Простое наследование

Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class).

В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник ВУЗа», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».

Множественное наследование

Косвенное множественное наследование

Прямое множественное наследование

class A{ //базовый класс

};

class B : public A{ //public наследование

}

class C : protected A{ //protected наследование

}

class Z : private A{ //private наследование

}

В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом:

  • при public-наследовании все спецификаторы остаются без изменения.

  • при protected-наследовании все спецификаторы остаются без изменения, кроме спецификатора public, который меняется на спецификатор protected (то есть public-члены базового класса в потомках становятся protected).

  • при private-наследовании все спецификаторы меняются на private.

Одним из основных преимуществ public-наследования является то, что указатель на классы—наследники может быть неявно преобразован в указатель на базовый класс, то есть для примера выше можно написать: