Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Наследование позволяет создавать классы на базе ранее созданных.
- Изменения, возможные при наследовании
- 1) можно добавлять в производный класс новые члены(поля/методы)
- 2) можно изменять реализацию унаследованных методов
- 3) можно изменять режимы доступа к унаследованным классам
- Наследование - инструмент повторного использования кода
- Пример:
- -учащееся
- -работяги
- -пенсионеры
- Создать класс человек и на базе его создать наследников(-учащееся-работяги-пенсионеры)
- Наследование позволяет реализовать динамический полиморфизм
- Наследование позволяет удобно создавать иерархию родственных типов.
- Человек - класс-родитель
- Остальные - классы-наследники(дочерний\производный класс)
- class TParent
- {
- ..
- };
- //реализация
- class TChild:режим_наследования TParent
- {
- Специфические члены класса TChild
- };
- //реализация специфических членов класса TChild
- Режимы наследования:
- -public(Все члены класса - родителя наследуются со своими спецификаторами доступа)
- -protected(private наследуется как private, остальное - protected)
- -private(все наследуется как private)
- class TPar{
- int a;
- protected:
- float b;
- public:
- double c;
- void p_vvod();
- void p_vivod();
- };
- void TPar::p_vvod()
- {
- cout << "вв. a, b , c";
- cin >> a >> b >> c;
- }
- void TPar::p_vivod()
- {
- cout << a << b << c;
- }
- class TChl:public TPar
- {
- char x;
- protected:
- int y;
- public:
- float z;
- void c_vvod();
- void c_vivod();
- };
- //реализация
- void TChl::c_vvod()
- {
- cout << "x , y , z";
- cin >> x >> y >> z;
- p_vvod(); //вызов унаследованного метода
- }
- void TChl::c_vivod()
- {
- cout << x << y << z;
- p_vivod();
- }
- void main()
- {
- TPar p; //16 байт
- TChl d; //9+16 = 25 байт
- p.p_vvod();
- p.p_vivod();
- cout << p.c << endl;
- d.c_vvod();
- d.c_vivod();
- d.p_vvod();
- d.p_vivod();
- cout << d.z << d.c << endl; //доступен только public
- Что изменится если режим наследования будет private?
- Станет недоступным:d.p_vvod();
- d.p_vivod();
- d.c
- Наследование != Агрегирование
- Агрегирование:
- class TA{..};
- class TB{TA*obj или TA obj};
- Наследование:
- class TP{...};
- class TC:режим TP
- {...};
- Конструкторы при наследовании:
- Объект дочернего класса одновременно является и объектом родительского класса
- Когда создается объект дочернего класса сначала вызывается конструктор родительского класса, выделяется память под изначальные поля, потом память для специфических полей класса-наследника.
- Разрушение в обратной последовательности.
- Явно заданные конструкторы не наследуются.
- Если прописываем конструкторы с параметрами, то конструктор производного класса обязан обеспечивать значениями все свои поля, включая унаследованные.
- class TPr{
- float x, y;
- public:
- TPr(float xx=1, float yy=2)
- void p_vivod();
- };
- //Реализация
- TPr::TPr(float xx, float yy)
- {
- x=xx; y=yy;}
- void TPr::p_vivod()
- {
- cout << x << y << endl;
- }
- class TPar:public TPr{
- float z;
- TPar(float xx=4, float yy=5, float zz=6);
- void c_vivod();
- };
- TPar::TPar(float xx, float yy, float zz):TPr(xx,yy) //Вызов родительского конструктора
- {z=zz}
- c_vivod как в предыдущем примере.
- Одноименные методы при наследовании:
- class TPar
- {
- int x;
- public:
- TPar(int xx = 1);
- 1)void p_vvod();
- 2)void vivod();
- };
- TPar::TPar(int xx)
- {x=xx};
- p_vivod также
- void TPar::vivod()
- cout << x << endl;
- }
- class TChl: public TPar
- {
- int y;
- public:
- TChl(int xx=1, int yy=2);
- 3)void c_vvod();
- 4)void vivod();
- };
- TChl::TChl(int xx, int yy): TPar(xx)
- {y=yy;}
- void TChl::c_vvod()
- {
- cout << "Вв. y"; cin >> y |Met. 1
- p_vvod(); |
- void TChl::vivod()
- {
- cout << y; TPar::vivod(); |Met. 2
- }
- void main()
- {
- TPar a;
- TChl b;
- a.p_vvod();|MET.1
- a.vivod();|MET.2
- b.c_vvod();|MET.3
- b.p_vvod();|MET.1
- b.vivod();|MET.4
- b.TPar::vivod();|MET.2
- }
- Множественное наследование.
- TParent1 TParent2
- TChl
- TParent1{};
- TParent2{};
- class TChl:режим1 TParent1, режим2 TParent2
- {};
- Виртуальное наследование:
- Чел
- Уч Раб Пенс
- УчРаб РабПенс
- При обычном наследовании класс работающий студент получает 2 комплекта членов класса "человек"
- Чтобы этого избежать наследование делают виртуально, для этого нужно указать слово virtual перед спецификатором доступа.
Add Comment
Please, Sign In to add comment