Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 130стр.doc
Скачиваний:
93
Добавлен:
15.06.2014
Размер:
2.49 Mб
Скачать

21)Полиморфизм. Перегрузка методов и операторов. Виртуальные методы.

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

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

перегрузка методов и операторов

Перегрузка оператора состоит в изменении смысла оператора при использовании его с определенным классом

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

* Для перегрузки операторов программы используют ключевое слово C ++ operator.

* Переопределяя оператор, вы указываете функцию, которую C++ вызывает каждый раз, когда класс использует перегруженный оператор. Эта функция, в свою очередь, выполняет соответствующую операцию.

* Если ваша программа перегружает оператор для определенного класса, то смысл этого оператора изменяется только для указанного класса, оставшаяся часть программы будет продолжать использовать этот оператор для выполнения его стандартных операций.

* C++ позволяет перегружать большинство операторов, за исключением четырех, перечисленных в таблице 24, которые программы не могут перегружать.

Перегрузка операторов может упростить наиболее общие операции класса и улучшить читаемость программы.

Когда вы перегружаете оператор для какого-либо класса, то смысл данного оператора не изменяется для переменных других типов. Например, если вы перегружаете оператор плюс для класса string, то смысл этого оператора не изменяется, если необходимо сложить два числа. Когда компилятор С++ встречает в программе оператор, то на основании типа переменной он определяет ту операцию, которая должна быть выполнена.

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

1. Чтобы перегрузить оператор, вы должны определить класс, которому оператор будет назначен.

2. Когда вы перегружаете оператор, перегрузка действует только для класса, в котором он определяется. Если программа использует оператор с неклассовыми переменными (например, переменными типа int или float), используется стандартное определение оператора.

3. Чтобы перегрузить оператор класса, используйте ключевое слово C++ operator для определения метода класса, который C++ вызывает каждый раз, когда переменная класса использует оператор.

4. C++ не позволяет вашим программам перегружать оператор выбора элемента (.), оператор указателя на элемент (.*), оператор разрешения области видимости (::) и условный оператор сравнения (?:)

Виртуальные функции

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

Если функция объявлена в базовом классе как виртуальная, ее можно переопределять только в производных классах и обязательно с тем же списком параметров. Если виртуальная функция производного класса изменила список параметров, то ее версия в базовом классе (и во всех его предшественниках) станет недоступной. Поначалу такая ситуация может показаться тупиковой - и на деле оказывается таковой в языках ООП, которые не поддерживают механизм перегрузки. C++ решает проблему, допуская использовать не виртуальные, а перегруженные функции с тем же именем, но с другим списком параметров.

Функция, объявленная виртуальной, считается таковой во всех производных классах - независимо от того, объявлена ли она в производных классах с ключевым словом virtual, или нет.

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

22) Понятие пространства имен. Объявление и использование пространств имен на языке C++.

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

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

Существует четыре типа областей видимости:

lokal - локальный, (имя, описанное в блоке . КРОМЕ МЕТОК И имен функций, принадлежащие к области видимости file или program.

file - видимый в файле,( имя, описанное вне какого-либо блока. Недоступно из других файлов. Кроме явного описания extern.)program - видимый в программе. class - видимый в классе. (имя элемента класса локально в его классе и может использоваться только либо в элементах функций этого класса, либо для объекта его класса, используя операцию (. ), либо для указателя на объект его класса, используя операцию -> )

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

В С++ определено 4 раздельных класса идентификаторов:1)имена перемен-ных, функций, типов, определенных пользователем (typedef) и констант перечислений в пределах одной области видимости. Все они, кроме имен функций, могут быть переопределены во вложенных блоках. 2) имена типов перечислений, структур, классов и объединений. Каждое имя должно отличаться от имен других типов в той же области видимости.3)Отдельный класс составляют элементы каждой структуры, класса и объединения. Имя элемента должно быть уникально внутри структуры, но может совпадать с именами элементов других структур.4)Метки образуют отдельное пространство имен.

Поименованные области служат для логического группирования объявлений. Простейшим примером применения является отделение кода, написанного одним человеком, от кода, написанного другим. Объявление поименованной области (ее также называют пространством имен) имеет формат: namespace [ имя_области ]{ /* Объявления */}

Поименованная область может объявляться неоднократно, последующие объявления рассматриваются как расширения предыдущих.Если имя области не задано, компилятор определяет его самостоятельно с помощью уни-кального идентификатора, различного для каждого модуля. Объявление объекта в непоименованной области равнозначно его описанию как глобального с модификатором static. Нельзя получить доступ из одного файла к элементу неименованной области другого файла. В объявлении поименованной области могут присутствовать как объявления, так и определения. Логично помещать в нее только объявления, а определять их позднее с помощью имени области и оператора доступа к области видимости ::, например: void demo::func1(int) { /* ... */}

Объекты, объявленные внутри области, являются видимыми с момента объявления. К ним можно явно обращаться с помощью имени области и оператора доступа к области видимости demo::i = 100; Если имя часто используется вне своего пространства, можно объявить его доступным с помощью оператора using: using demo::i; После этого можно использовать имя без явного указания области. Если требуется сделать доступными все имена из какой-либо области, используется оператор using namespace:using namespace demo; Операторы using и using namespace можно использовать и внутри объявления поименованной области, чтобы сделать в ней доступными объявления из другой области.

Объекты стандартной библиотеки определены в пространстве имен std. Например, объявления стандартных средств ввода/вывода С в заголовочном файле < stdio . h > помещены в пространство имен следующим образом:

// stdio.h

namespace std{

int printf(const char*...);

... } using namespace std;