
- •Наследование классов, виртуальные функции
- •Теоретические сведения
- •Передача параметров в базовый класс
- •Типы наследования (уровни доступа к базовому классу)
- •Public – наследование
- •Использование методов
- •Private – наследование
- •Использование методов
- •Protected – наследование
- •Виртуальные функции и полиморфизм
- •Контрольные вопросы
- •Общие требования выполнения работы
Public – наследование
Доступ к зоне 1 из зоны 2 (из методов производного класса к базовому классу)
доступны (без посредников) public и protected
нет доступа к private–переменным (только через методы класса)
Объявление в Base |
Доступ из Derived |
private |
Недоступны: доступ через методы класса |
protected |
Доступны |
public |
Доступны |
Доступ к зоне 1 из зоны 3 (из функции main():
private и protected-переменные доступны через методы класса
public-переменные доступны без посредников (непосредственно)
Объявление в Base |
Доступ из функции mane() |
private |
Недоступны: доступ через методы класса |
protected |
Недоступны: доступ через методы класса |
public |
Доступны |
Использование методов
Base – пользователям доступны только Base - методы
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-х ступенчатый (методы производного класса обращаются к методам базового класса)
Доступ к переменным своего класса не изменился.