- •Наследование классов, виртуальные функции
- •Теоретические сведения
- •Передача параметров в базовый класс
- •Типы наследования (уровни доступа к базовому классу)
- •Public – наследование
- •Использование методов
- •Private – наследование
- •Использование методов
- •Protected – наследование
- •Виртуальные функции и полиморфизм
- •Контрольные вопросы
- •Общие требования выполнения работы
Передача параметров в базовый класс
До тех пор, пока конструкторы не имеют аргументов, от производного класса не требуется каких-либо специальных действий. Однако, когда базовый класс имеет конструктор с аргументами, производные классы должны явным образом обрабатывать эту ситуацию путем передачи базовому классу необходимых аргументов.
Для передачи параметров используется расширенная форма конструкторов производных классов, когда часть аргументов предназначается только для передачи в базовый класс.
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
// базовый класс (зона 1)
class student
{ string name; // private-данные
protected: string adr; // protected-данные
// public область- до конца класса все элементы открытые
public: int age; // public-данные
student(string cname, string cadr, int cage): name(cname),adr(cadr),age(cage) {}
student(student& s)
{ name=s.name;
adr=s.adr;
age=s.age;
}
// методы для внешнего доступа
string getname() // передача указателя
{return name;} // во внешнюю
string getadr() // программу
{return adr;}
// внешний ввод данных
// запись текста в закрытую область
void setname (string n) {name=n;}
void setadr (string n) {adr=n;}
}; //--- конец определения базового класса
//--------------- Класс-наследник, тип наследования public (зона 2)
class itog: public student
{ int test; // private-данные
protected: int lab;
public: int bdz; //public область
itog(student& cstud, int ctest, int clab, int cbdz)
:student(cstud)
{test=ctest;
lab=clab;
bdz=cbdz;
}
itog(string cname, string cadr, int cage, int ctest, int clab, int cbdz)
: student(cname,cadr,cage)
{test=ctest;
lab=clab;
bdz=cbdz;
}
//--- методы для внешнего доступа
// передача данных во внешнюю программу (чтение)
int get_lab()
{return lab;}
int get_test ()
{return test;}
// Derived-метод
void set_itog(char* n, char* a, int g, int t, int l, int b)
{ getname()=n;
adr=a;
age=g;
test=t;
lab=l;
bdz=b;
}
}; //-- конец определения произв. класса
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;
}
Типы наследования (уровни доступа к базовому классу)
Рассмотрим несколько зон программы:
Базовый класс (Base)
Производный класс (Derived)
Внешняя программа (main)
Методы базового класса всегда (при всех типах наследования) доступны из методов производного класса
Во внешней программе могут создаваться различные объекты ():
пользователи (объекты) базового класса
пользователи (объекты) производного класса
Тип наследования задает правила работы с данными и методами относительно 3-х зон и 2-х типов пользователей.
