Добавил:
ИВТ (советую зайти в "Несортированное") Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
23.11.2024
Размер:
207.36 Кб
Скачать

Public – наследование

Доступ к зоне 1 из зоны 2 (из методов производного класса к базовому классу)

  • доступны (без посредников) public и protected

  • нет доступа к private–переменным (только через методы класса)

Объявление в Base

Доступ из Derived

private

Недоступны: доступ через методы класса

protected

Доступны

public

Доступны

Доступ к зоне 1 из зоны 3 (из функции main():

  • private и protected-переменные доступны через методы класса

  • public-переменные доступны без посредников (непосредственно)

Объявление в Base

Доступ из функции mane()

private

Недоступны: доступ через методы класса

protected

Недоступны: доступ через методы класса

public

Доступны

Использование методов

  1. Base – пользователям доступны только Base - методы

  2. Derived - пользователям доступны Derived и Base - методы

Все предыдущие примеры относились к Public – наследованию

Private – наследование

Доступ к зоне 1 из зоны 2 (из методов производного класса к базовому классу)

public, protected, private - нет доступа к (только через методы класса)

Объявление в Base

Доступ из Derived

private

private

protected

private

public

private

Доступ к зоне 1 из зоны 3

( как при public-наследовании):

  • private и protected-переменные доступны через методы класса

  • public-переменные доступны без посредников (непосредственно)

Использование методов

Base – пользователям доступны только Base - методы

Derived - пользователям доступны только Derived - методы

можно обращаться только к методам своего класса

В нашем примере изменим тип наследования, оставляя всё другое без изменения

class itog: private student // производный класс

{ . . . }

После трансляции получим три ошибки :

int _tmain(int argc, _TCHAR* argv[])

{student S("Иванов","Общежитие МИЭТ",20); // Base - пользователь

itog T1(S,3,4,5); // Derived - пользователь

S.age=27;

T1.set_itog("Петров","Зеленоград", 22, 25, 30, 12);

cout<< "Итоги для: "<<T1.getname() ; // Ошибка!!!!!!

cout<<", адрес " <<T1.getadr(); // Ошибка!!!!!!

cout<<", возраст: "<<T1.age; // Ошибка!!!!!!

// доступ к своим данным

cout<<"\nБаллы : \n по тестам "<<T1.get_test();

cout<<"\n по лабам "<<T1.get_lab();

cout<< "\n по БДЗ "<<T1.bdz;

cout<< endl;

system ("pause");

return 0;

Для доступа к переменным базового класса (любого типа доступа: private, protected, public) придется добавлять методы как в базовый, так и в производный классы.

class itog: private student // производный класс

{ . . .

public:

int getage(){return age;}

}

class itog: private student

{. . .

public:

//--- методы для доступа к базовому классу

string dget_name() {return getname();}

string dget_adr() {return getadr();}

int dget_age() {return getage();}

}; //-- конец определения произв. Класса

int _tmain(int argc, _TCHAR* argv[])

{ . . .

// доступ к Base -данным

cout<< "Итоги для: " <<T1.dget_name() ;

cout<<", адрес " <<T1.dget_adr();

cout<<", возраст: " <<T1.dget_age();

// доступ к своим данным

cout<<"\nБаллы : \n по тестам "<<T1.get_test();

cout<<"\n по лабам "<<T1.get_lab();

cout<< "\n по БДЗ "<<T1.bdz; }

Доступ к переменным базового класса стал 2-х ступенчатый (методы производного класса обращаются к методам базового класса)

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

Соседние файлы в папке _Задания к лабам