Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Производные классы. Доступ к полям и функциям базового класса



Производный класс можно рассматривать как расширение существующего класса. Исходный класс называется базовым или родительским, а производный – подклассом или потомком. Производный класс представляет собой расширение или модификацию базового класса. Имея родительский класс, можно использовать единый интерфейс для получения нескольких производных классов.
Любой класс может быть родительским, и любой производный класс будет следовать его описанию. Класс-потомок может иметь дополнительные возможности по сравнению с базовым классом. В производном классе можно изменить права доступа, добавить новые элементы или перегрузить имеющиеся методы.
Синтаксис производного класса:

class ИмяПроизводногоКласса:(public/private/protected)

ИмяРодительскогоКласса {. . . };

Слова public, private и protected являются модификаторами доступа методов производного класса к элементам родительского класса. Модификатор public не меняет тип доступа, модификатор private делает для всех элементов базового класса тип доступа private, а модификатор protected разрешает доступ методов производного класса к общим элементам базового класса, но запрещает доступ для всех других методов. Если необходимо некоторым элементам изменить тип доступа, то их объявляют в производном классе повторно в соответствующей секции.
Если производный класс имеет всего один родительский класс, то такое наследование называется простым, в противном случае наследование называется сложным. Пример сложного наследования:

class A{. . .};

class B{. . .};

class C:public A, protected B{. . .};

 

Таким образом, внутри производного класса существует четыре уровня, для которых определяется атрибут доступа:

для членов базового класса;

для членов производного класса;

для процесса наследования;

для изменения атрибутов при наследовании.

Рассмотрим как при этом регулируется доступ к членам класса извне класса и внутри класса.

Доступ извне.

Доступными являются лишь элементы с атрибутом public.

Собственные члены класса.

Доступ регулируется только атрибутом доступа, указанным при описании класса.

Наследуемые члены класса.

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

Пример.

class Basis

{public:

int a;

protected:

int b, c;};

class Derived : public Basis

{public: Basis::c;};



int main (void)

{ Basis ob;

Derived od;

ob.a; // правильно

ob.b; // ошибка

od.c; // правильно

od.b; // ошибка

return 0;}

Доступ изнутри.

Собственные члены класса.

private и protected члены класса могут быть использованы только функциями-членами данного класса.

Наследуемые члены класса.

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

protected или public члены класса доступны для всех функций-членов. Подразделение на public, protected и private относится при этом к описаниям, приведенным в базовом классе, независимо от формы наследования.

Пример.

class Basis

{public:

void f1(int i)

{ a = i;

b = i; }

int b;

private:

int a;};

class Derived : private Basis

{public:

void f2(int i)

{ a = i; // ошибка

b = i; // правильно }};

 

 

88. Простой класс. Вложенные классы

Изучение классов начнем с простого примера. Ниже приведен код класса Box (Параллелепипед), который определяет три переменных экземпляра: width (ширина), height (высота) и depth (глубина). В настоящий момент Box не содержит никаких методов (но вскоре мы добавим в него метод).

class Box {double width; double height; double depth; }

Как уже было сказано, класс определяет новый тип данных. В данном случае новый тип данных назван Box. Это имя будет использоваться для объявления объектов типа Box. Важно помнить, что объявление class создает только шаблон, но не действительный объект. Таким образом, приведенный код не приводит к появлению никаких объектов типа Box.

Чтобы действительно создать объект Box, нужно использовать оператор, подобный следующему:

Box mybox = new Вох();// создание объекта mybox типа Box

После выполнения этого оператора mybox станет экземпляром класса Box. То есть он обретет "физическое" существование. Но пока можете не задумываться о нюансах этого оператора.



Повторим еще раз: при каждом создании экземпляра класса мы создаем объект, который содержит собственную копию каждой переменной экземпляра, определенной классом. Таким образом, каждый объект Box будет содержать собственные копии переменных экземпляра width, height и depth. Для получения доступа к этим переменным применяется операция точки (.). Эта операция связывает имя объекта с именем переменной экземпляра. Например, чтобы присвоить переменной width объекта mybox значение 100, нужно было бы использовать следующий оператор:

mybox.width = 100;

Вложенный класс.Этот оператор указывает компилятору, что копии переменной width, хранящейся внутри объекта mybox, нужно присвоить значение, равное 100. В общем случае операцию точки используют для доступа как к переменным экземпляра, так и к методам внутри объекта.

писание класса может быть вложенным. Например:

class set {
struct setmem { int mem;
setmem* next;
setmem(int m, setmem* n) { mem=m; next=n; } };
setmem* first;
public: set() { first=0; }
insert(int m) { first = new setmem(m,first); } // ... };

Доступность вложенного класса ограничивается областью видимости лексически объемлющего класса:

setmem m1(1,0); // ошибка: setmem не находится
// в глобальной области видимости

Если только описание вложенного класса не является совсем простым, то лучше описывать этот класс отдельно, поскольку вложенные описания могут стать очень запутанными:

class setmem { friend class set; // доступно только для членов set
int mem; setmem* next;
setmem(int m, setmem* n) { mem=m; next=n; }
// много других полезных членв
};
class set { setmem* first;
public:
set() { first=0; }
insert(int m) { first = new setmem(m,first); } // ... };

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

 


Эта страница нарушает авторские права

allrefrs.ru - 2019 год. Все права принадлежат их авторам!