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

Вопрос 17. Перегрузка операций индексации массива.

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

char operator [](int i)

{

return str[i];

}

Где в аргументе ф-ции передается индекс массива. Тип int не обязателен, но т. к. индексируется целыми числами, то используют его. Достоинство – с его помощью можно предотвратить выход за пределы массива.

Нельзя использовать friend.

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

class String { private:

char* s;

public:

String(char*);

char operator[](int n) const; }; // n-й символ

char String::operator[](int n)

{ // Здесь должна выполняться проверка диапазона

return s[n]; }

Поскольку оператор [] может вызываться лишь с одним аргументом, для имитации многомерных массивов часто применяют анонимные экземпляры, что позволяет создать произвольное кол-во псевдоаргументов.

Вопрос 18. Понятие наследования. Механизм ограничения доступа при наследовании.

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

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

Производный класс не может иметь доступ к закрытым Эл-там своего базового класса; Но может иметь доступ к открытым и защищенным Эл-там своего базового класса. Эл-ты базового класса, к-ые не должны быть доступны производному классу ч/з наследование, объявляются в базовом классе закрытыми.

Защищенные элементы

Открытые элементы базового класса доступны всем ф-циям програм­мы. Закрытые Эл-ты базового класса доступны только ф-циям-эл-­там и друзьям базового класса.

Защищенный уровень доступа служит промежуточным уровнем защиты м/у открытым доступом и закрытым доступом. Защищенные Эл-ты базового класса могут быть доступны только Эл-там и друзьям базового класса и Эл-там и друзьям производного класса.

Эл-ты производного класса могут ссылаться на открытые и защищен­ные Эл-ты базового класса простым использованием имен этих элементов.

Вопрос 19. Приведение типа указателя базового класса к указателю производного класса и наоборот.

В общем случае ук-ль одного типа не может указывать на объект другого типа. Из этого правила есть исключение, к-ое относится только к производным классам. Т.е. ук-ль на базовый класс может указывать на объект производного класса, получ-го из этого баз-го класса. Пусть есть базов. класс B_class и производный от него - класс D_class

В_class *p;

B_class B_ob;

D_class D_ob;

p = &B_ob; // р указ на объект типа B_class

p = &D_ob;// р указ-ет на объект типа D_class, явл-ся объектом, произв. от B_class

Используя указ-ль р, можно получить доступ ко всем членам D_ob, к-ые наследованы от B_ob. Однако специфические члены D_ob не могут быть получены с исп-ем указ-ля р (до тех пор, пока не осущ-но приведение типов((D_class *)p)-> f(); \\ здесь ф-я f() член класса D_class). Это явл-ся следствием того, что указатель знает только о членах базового класса и ничего не знает о специфич-х членах производных классов.

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

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