ann_candle

Виртуальные функции

Jun 27th, 2021
1,280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.43 KB | None | 0 0
  1. //protos.h
  2. //
  3. // Created by anna on 12.06.21.
  4. //
  5.  
  6. #ifndef LAB7_VIRTUALS_PROTOS_H
  7. #define LAB7_VIRTUALS_PROTOS_H
  8.  
  9. #include<iostream>
  10. using namespace std;
  11. //классы для ручного виртуального связывания
  12. class Bas {
  13. public:
  14.     int a;
  15.     int ClassType;
  16.     Bas(){ a = 0; ClassType = 0;};
  17.     Bas( int x){ a = x; ClassType = 0;};
  18. };
  19.  
  20. class Type1: public Bas {
  21. public:
  22.     int Coord;
  23.     Type1(){ Coord = 0; ClassType = 1;};
  24.     Type1( int x){ Coord = x; ClassType = 1;};
  25.     void Move (int Delta) {Coord = Coord + Delta; }; // Метод для динамического вызова "+"
  26. };
  27.  
  28. class Type2: public Bas {
  29. public:
  30.     int Coord;
  31.     Type2(){ Coord = 0; ClassType = 2;};
  32.     Type2( int x){ Coord = x; ClassType = 2;};
  33.     void Move (int Delta) {Coord = Coord - Delta; }; // Метод для динамического вызова  "-"
  34. };
  35.  
  36. //классы для автоматического виртуального связывания
  37. class Abstr
  38. {
  39. protected:
  40.     int iPar;
  41. public:
  42.     Abstr(int p) {iPar = p;}
  43.     Abstr() {iPar = 0;}
  44.     virtual void print()=0;
  45.     virtual ~Abstr() {cout << "виртуальный деструктор Abstr = " << iPar << endl;}
  46. };
  47.  
  48. class Deriv1:public Abstr
  49. {
  50. protected:int iDPar;
  51. public:
  52.     Deriv1(int p=1, int a = 0)
  53.     {
  54.         iDPar = p;
  55.         iPar = a;
  56.     }
  57.     //Deriv1(){iDPar = 1;}
  58.     virtual void print() {cout <<"Deriv1 = "<< iDPar<< " Abstr = " << iPar << endl;}
  59.     virtual ~Deriv1() {cout << "виртуальный деструктор Deriv1 = " << Deriv1::iDPar << endl;}
  60. };
  61.  
  62. class Deriv2:public Deriv1
  63. {
  64. protected:int iDPar;
  65. public:
  66.     Deriv2(int p = 2, int p1 = 1, int a = 0)
  67.     {
  68.         Deriv2::iDPar = p;
  69.         Deriv1::iDPar = p1;
  70.         iPar = a;
  71.     }
  72.     //Deriv2(){iDPar = 2;}
  73.     virtual void print() {cout <<"Deriv2 = "<< iDPar<<" Deriv1 = " << Deriv1::iDPar << " Abstr = " << iPar << endl;}
  74.     virtual ~Deriv2() {cout << "виртуальный деструктор Deriv2 = " << Deriv2::iDPar<< endl;}
  75. };
  76.  
  77. class Deriv3:public Deriv1
  78. {
  79. protected:int iDPar;
  80. public:
  81.     Deriv3(int p = 3, int p1 = 1, int a = 0)
  82.     {
  83.         Deriv3::iDPar = p;
  84.         Deriv1::iDPar = p1;
  85.         iPar = a;
  86.     }
  87.     //Deriv3(){iDPar = 3;}
  88.     virtual void print() {cout <<"Deriv3 = "<< iDPar<< " Deriv1 = " << Deriv1::iDPar <<" Abstr = " << iPar << endl;}
  89.     virtual ~Deriv3() {cout << "виртуальный деструктор Deriv3 = " << Deriv3::iDPar << endl;}
  90. };
  91.  
  92. //виртуальные классы
  93. class A {
  94. public:
  95.     int a;
  96.     A(int x = 0) : a(x) {}
  97. };
  98. class F : virtual public A {
  99. public:
  100.     int f;
  101.     F(int x=0, int y=1) : A(x), f(y) {}
  102. };
  103. class C : virtual public A {
  104. public:
  105.     int c;
  106.     C(int x=2, int y=4) : A(x), c(y) {}
  107. };
  108. class D : public F, public C {
  109. public:
  110.     int d;
  111.     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; }
  112. };
  113.  
  114.  
  115. #endif //LAB7_VIRTUALS_PROTOS_H
  116.  
  117.  
  118.  
  119. //main.cpp
  120. #include <iostream>
  121. #include <list>
  122. #include "protos.h"
  123. int main() {
  124.     //ручное виртуальное связывание
  125.     cout << "ручное виртуальное связывание" << endl;
  126.     Type1 T1(5);
  127.     Type2 T2(25);
  128.     cout << "T1 = " << T1.Coord << " T2 = " << T2.Coord <<endl;
  129.     // Задание значения указателя для Т1
  130.     Bas* pObj = &T1;
  131.     //pObj->Move(); не сработает, так как указатель на базовый класс, а там Move нет!
  132.     switch (pObj->ClassType)
  133.     {
  134.         case 1:
  135.             ((Type1 *)pObj)->Move(5); break; // Типизация указателя для Type1
  136.         case 2:
  137.             ((Type2 *)pObj)->Move(5); break; // Типизация указателя для Type2
  138.     };
  139.     cout << "T1 = " << T1.Coord << " T2 = " << T2.Coord <<endl;
  140. // Задание значения указателя для Т2
  141.     pObj = &T2;
  142.     switch (pObj->ClassType)
  143.     {
  144.         case 1:
  145.             ((Type1 *)pObj)->Move(5); break;
  146.         case 2:
  147.             ((Type2 *)pObj)->Move(5); break;
  148.     };
  149.     cout << "T1 = " << T1.Coord << " T2 = " << T2.Coord <<endl;
  150.     //автоматическое виртуальное связывание
  151.     //проверка создания объектов
  152.     //Abstr a; - не сработает, т.к. нельзя создать объект абстрактного класса
  153.     Abstr *pAbs; //а указатель на объект абстрактного класса создать можно
  154.     Deriv1 d1(33);
  155.     Deriv2 d2(44);
  156.     Deriv3 d3(66);
  157.     cout << "проверка вызова вирт. функции" <<endl;
  158.     d1.print();
  159.     d2.print();
  160.     d3.print();
  161.     cout << "проверка вызова вирт. функции через указатель на объект" << endl;
  162.     Deriv1 *pd1 = &d1;
  163.     Deriv2 *pd2 = &d2;
  164.     Deriv3 *pd3 = &d3;
  165.     pd1->print();
  166.     pd2->print();
  167.     pd3->print();
  168.     cout << "проверка вызова вирт. функции через указатель на объект базового класса" << endl;
  169.     pAbs = &d1;
  170.     pAbs->print();
  171.     pAbs = &d2;
  172.     pAbs->print();
  173.     pAbs = &d3;
  174.     pAbs->print();
  175.     cout << "работа со списком объектов" << endl;
  176.     list<Abstr*> ListDer;
  177.     int sz = 3;
  178.     for(int i=1; i<=sz; i++)
  179.         ListDer.push_back(new Deriv1(i*2, i*(-1)));
  180.     for(int i=1; i<=sz; i++)
  181.         ListDer.push_back(new Deriv2(i*4, i+2, i*(-2)));
  182.     for(int i=1; i<=sz; i++)
  183.         ListDer.push_back(new Deriv3(i*8, i+3, i*(-3)));
  184.     for(auto e:ListDer)
  185.         e->print();
  186.     cout << "очистка списка" << endl;
  187.     for (auto e:ListDer)
  188.         delete(e);
  189.     ListDer.clear();
  190.     cout << "виртуальные классы" << endl;
  191.     D obj(2, 4, 6, 8);
  192.     cout << "obj.a =" << obj.a << endl;//Обращение к полю а как к полю класса D
  193.     cout << "obj.A::a = " << obj.A::a << endl;  // обращение к полю а напрямую как к полю класса А
  194.     cout << "obj.F::a = " << obj.F::a << endl;  //  -//- F
  195.     cout << "obj.C::a = " << obj.C::a << endl;  // -// C
  196.     //обращение к остальным полям
  197.     cout << "obj.f = " << obj.f << endl;
  198.     cout << "obj.c = " << obj.c << endl;
  199.     cout << "obj.d = " << obj.d << endl;
  200.     return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment