Теоретические сведения для студентов специальностей «Экономика и организация производства», страница 20

Замечание:так как деструктор не имеет списка аргументов, то нет способа выбрать ту или иную функцию при попытке перегрузить деструктор. Поэтому перегрузка деструктора невозможна.

Тема 7. НАСЛЕДОВАНИЕ И ЗАЩИТА

Обычно при разработке нетривиальных программ классы образуют иерархическую структуру, отображающую существующую иерархию объектов. Иерархия классов формируется созданием производных классов на основе базовых, обладающих наиболее общими данными и методами. В свою очередь производный класс может использоваться как базовый для других классов. Здесь класс, на основе которого строится другой класс, называется базовым, а построенный класс – производным.

Шаблон объявления класса можно представить следующим образом: ключ_класса имя_производного_класса: необязательный модификатор доступа имя_базового_класса {тело_производного_класса} объекты производного_класса (через запятую);

Пример:

          class Point : public Location {... телокласса Point ...};

Класс Location является базовым и наследуется с атрибутом public. Класс Point - производный класс. Список объектов опущен (после закрывающей фигурной скобки стоит точка с запятой). Двоеточие (:) отделяет производный класс от базового. Атрибут класса (модификатор прав доступа) может задаваться ключевыми словами public и private. Атрибут может опускаться – в этом случае принимается атрибут по умолчанию (для ключевого слова class – private, для struct – public). Смесь (union) не может быть базовым или производным классом.

Атрибут (модификатор прав доступа) используется для изменения прав доступа к наследуемым элементам класса в соответствии с правилами, указанными в табл. 1.

Таблица 1

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

Модификатор наследования прав

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

private

private

Нет доступа

protected

private

private

public

private

private

private

public

Нет доступа

protected

public

protected

public

public

public

Отметим, что в производных классах права на доступ к элементам базовых классов не могут быть расширены, а только более ограничены. Наследование может осуществляться с атрибутом доступа public или private по отношению к базовому классу.

Атрибут private (см. табл. 1), используемый по умолчанию в объявлениях производного класса с ключевым словом "class" или задаваемый явно, трансформирует элементы базового класса с атрибутами доступа public или protected в элементы private производного класса. Доступ же к элементам private базового класса из производного невозможен по определению private атрибутов.

Атрибут public, используемый явно или по умолчанию при объявлении производного класса с ключом structure, не изменяет ограничения на доступ для атрибутов, наследуемых из базового класса, т.е. доступными являются элементы, объявленные в базовом классе как protected или public. Доступ к private невозможен по определению private элементов класса.

Иллюстративный пример наследования прав доступа:

class A {int a1;

          public:         int a2;

          void f1(void) };

          class b: A { int b1;

public:

          void f1 (void)

          { a1=1;

// ошибка, а1 - private - переменная класса A и доступна только для

//методов и дружественных функций собственного класса.

          b1=0; //доступ к переменной типа private из метода класса;

          a2=1; // а2 унаследована из класса A с атрибутом доступа

                    //private и поэтому доступна в методе класса;

          } };

          void main(void)

          { A a_ob1;             // объявление объекта a_ob1 класса A и

          b b_ob1;                // объекта b_ob1 класса b

b_ob1.a2+=1;                  //ошибка, т.к. а2 private