Advertisement
Ejejejejejjr

Полиморфизм

Dec 27th, 2020
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. //этот класс является абстрастрактным, потому что содержит в себе чисто вирутальную функцию
  5. class Weapon
  6. {
  7.   public:
  8.     //чисто виртуальная функция
  9.     virtual void Shoot() = 0;
  10. };
  11.  
  12. //этот класс наследует класс Weapon, который является просто "коробкой" для остальных классов
  13. class Gun : public Weapon
  14. {
  15.   public:
  16.     //создание  виртуальной функции
  17.     virtual void Shoot()
  18.     {
  19.         std::cout << "BANG!" << std::endl;
  20.     }
  21. };
  22.  
  23. class MachineGun : public Gun
  24. {
  25.   public:
  26.     // перегрузка унаследованного виртуального метода класса A
  27.     //ключевое слово override нужно для корректой обработки ошибок виртуальных методов, связанных с невалидной сигнатурой
  28.     void Shoot() override
  29.     {
  30.         std::cout << "BANG! BANG! BANG! BANG!" << std::endl;
  31.     }
  32. };
  33.  
  34. //базука не относится к Gun , поэтому она наследует класс Weapon
  35. class Bazooka : public Weapon
  36. {
  37.   public:
  38.     void Shoot() override
  39.     {
  40.         std::cout << "BUM" << std::endl;
  41.     }
  42. };
  43.  
  44. // класс Knife наследует класс Weapon, так как не является огнестрельным оружием
  45. class Knife : public Weapon
  46. {
  47.   public:
  48.     void Shoot() override
  49.     {
  50.         std::cout << "Oh" << std::endl;
  51.     }
  52. };
  53.  
  54. class Player
  55. {
  56.   public:
  57.     void Shoot(Weapon *weapon)
  58.     {
  59.         //обращение к одной из перегрузок виртуальной функции
  60.         weapon->Shoot();
  61.     }
  62. };
  63.  
  64. int main(int argc, char *argv[])
  65. {
  66.     setlocale(LC_ALL, "Rus");
  67.     srand(time(NULL));
  68.    
  69.     //создание необходимых объектов
  70.     Gun gun;
  71.     MachineGun machinegun;
  72.     Bazooka bazooka;
  73.     Knife knife;
  74.    
  75.     Player player;
  76.  
  77.     //вызов метода, принимающего в качестве параметра ссылку на объект класса Gun или наследника
  78.     player.Shoot(&machinegun);
  79.     player.Shoot(&gun);
  80.     player.Shoot(&bazooka);
  81.     player.Shoot(&knife);
  82.  
  83.     return 0;
  84. }
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement