Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //protos.h
- //
- // Created by anna on 12.06.21.
- //
- #ifndef LAB7_VIRTUALS_PROTOS_H
- #define LAB7_VIRTUALS_PROTOS_H
- #include<iostream>
- using namespace std;
- //классы для ручного виртуального связывания
- class Bas {
- public:
- int a;
- int ClassType;
- Bas(){ a = 0; ClassType = 0;};
- Bas( int x){ a = x; ClassType = 0;};
- };
- class Type1: public Bas {
- public:
- int Coord;
- Type1(){ Coord = 0; ClassType = 1;};
- Type1( int x){ Coord = x; ClassType = 1;};
- void Move (int Delta) {Coord = Coord + Delta; }; // Метод для динамического вызова "+"
- };
- class Type2: public Bas {
- public:
- int Coord;
- Type2(){ Coord = 0; ClassType = 2;};
- Type2( int x){ Coord = x; ClassType = 2;};
- void Move (int Delta) {Coord = Coord - Delta; }; // Метод для динамического вызова "-"
- };
- //классы для автоматического виртуального связывания
- class Abstr
- {
- protected:
- int iPar;
- public:
- Abstr(int p) {iPar = p;}
- Abstr() {iPar = 0;}
- virtual void print()=0;
- virtual ~Abstr() {cout << "виртуальный деструктор Abstr = " << iPar << endl;}
- };
- class Deriv1:public Abstr
- {
- protected:int iDPar;
- public:
- Deriv1(int p=1, int a = 0)
- {
- iDPar = p;
- iPar = a;
- }
- //Deriv1(){iDPar = 1;}
- virtual void print() {cout <<"Deriv1 = "<< iDPar<< " Abstr = " << iPar << endl;}
- virtual ~Deriv1() {cout << "виртуальный деструктор Deriv1 = " << Deriv1::iDPar << endl;}
- };
- class Deriv2:public Deriv1
- {
- protected:int iDPar;
- public:
- Deriv2(int p = 2, int p1 = 1, int a = 0)
- {
- Deriv2::iDPar = p;
- Deriv1::iDPar = p1;
- iPar = a;
- }
- //Deriv2(){iDPar = 2;}
- virtual void print() {cout <<"Deriv2 = "<< iDPar<<" Deriv1 = " << Deriv1::iDPar << " Abstr = " << iPar << endl;}
- virtual ~Deriv2() {cout << "виртуальный деструктор Deriv2 = " << Deriv2::iDPar<< endl;}
- };
- class Deriv3:public Deriv1
- {
- protected:int iDPar;
- public:
- Deriv3(int p = 3, int p1 = 1, int a = 0)
- {
- Deriv3::iDPar = p;
- Deriv1::iDPar = p1;
- iPar = a;
- }
- //Deriv3(){iDPar = 3;}
- virtual void print() {cout <<"Deriv3 = "<< iDPar<< " Deriv1 = " << Deriv1::iDPar <<" Abstr = " << iPar << endl;}
- virtual ~Deriv3() {cout << "виртуальный деструктор Deriv3 = " << Deriv3::iDPar << endl;}
- };
- //виртуальные классы
- class A {
- public:
- int a;
- A(int x = 0) : a(x) {}
- };
- class F : virtual public A {
- public:
- int f;
- F(int x=0, int y=1) : A(x), f(y) {}
- };
- class C : virtual public A {
- public:
- int c;
- C(int x=2, int y=4) : A(x), c(y) {}
- };
- class D : public F, public C {
- public:
- int d;
- D(int x=6, int y=8, int z=10, int q=12) : A(x), F(x + 10, y), C(x + 100, z) { d = q; }
- };
- #endif //LAB7_VIRTUALS_PROTOS_H
- //main.cpp
- #include <iostream>
- #include <list>
- #include "protos.h"
- int main() {
- //ручное виртуальное связывание
- cout << "ручное виртуальное связывание" << endl;
- Type1 T1(5);
- Type2 T2(25);
- cout << "T1 = " << T1.Coord << " T2 = " << T2.Coord <<endl;
- // Задание значения указателя для Т1
- Bas* pObj = &T1;
- //pObj->Move(); не сработает, так как указатель на базовый класс, а там Move нет!
- switch (pObj->ClassType)
- {
- case 1:
- ((Type1 *)pObj)->Move(5); break; // Типизация указателя для Type1
- case 2:
- ((Type2 *)pObj)->Move(5); break; // Типизация указателя для Type2
- };
- cout << "T1 = " << T1.Coord << " T2 = " << T2.Coord <<endl;
- // Задание значения указателя для Т2
- pObj = &T2;
- switch (pObj->ClassType)
- {
- case 1:
- ((Type1 *)pObj)->Move(5); break;
- case 2:
- ((Type2 *)pObj)->Move(5); break;
- };
- cout << "T1 = " << T1.Coord << " T2 = " << T2.Coord <<endl;
- //автоматическое виртуальное связывание
- //проверка создания объектов
- //Abstr a; - не сработает, т.к. нельзя создать объект абстрактного класса
- Abstr *pAbs; //а указатель на объект абстрактного класса создать можно
- Deriv1 d1(33);
- Deriv2 d2(44);
- Deriv3 d3(66);
- cout << "проверка вызова вирт. функции" <<endl;
- d1.print();
- d2.print();
- d3.print();
- cout << "проверка вызова вирт. функции через указатель на объект" << endl;
- Deriv1 *pd1 = &d1;
- Deriv2 *pd2 = &d2;
- Deriv3 *pd3 = &d3;
- pd1->print();
- pd2->print();
- pd3->print();
- cout << "проверка вызова вирт. функции через указатель на объект базового класса" << endl;
- pAbs = &d1;
- pAbs->print();
- pAbs = &d2;
- pAbs->print();
- pAbs = &d3;
- pAbs->print();
- cout << "работа со списком объектов" << endl;
- list<Abstr*> ListDer;
- int sz = 3;
- for(int i=1; i<=sz; i++)
- ListDer.push_back(new Deriv1(i*2, i*(-1)));
- for(int i=1; i<=sz; i++)
- ListDer.push_back(new Deriv2(i*4, i+2, i*(-2)));
- for(int i=1; i<=sz; i++)
- ListDer.push_back(new Deriv3(i*8, i+3, i*(-3)));
- for(auto e:ListDer)
- e->print();
- cout << "очистка списка" << endl;
- for (auto e:ListDer)
- delete(e);
- ListDer.clear();
- cout << "виртуальные классы" << endl;
- D obj(2, 4, 6, 8);
- cout << "obj.a =" << obj.a << endl;//Обращение к полю а как к полю класса D
- cout << "obj.A::a = " << obj.A::a << endl; // обращение к полю а напрямую как к полю класса А
- cout << "obj.F::a = " << obj.F::a << endl; // -//- F
- cout << "obj.C::a = " << obj.C::a << endl; // -// C
- //обращение к остальным полям
- cout << "obj.f = " << obj.f << endl;
- cout << "obj.c = " << obj.c << endl;
- cout << "obj.d = " << obj.d << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment