Информатика, вопрос задал Kukuwka0Ha0DepeBe , 1 год назад

C++
Реализовать полиморфную схему оружия.

Есть абстрактный класс Оружие. Два поля:
- Текущее кол-во патрон
- Максимальное патрон

И два абстактных метода - Выстрелить и Перезарядиться.

=================

От этого класса унаследовать два класса:

- Пистолет (максимальное кол-во патрон 12, при выстреле тратится 1 патрон).

- Автомат (максимальное кол-во патрон 30, при выстреле тратится 3 патрона).

В мейне через оружие создать пистолет и автомат
Weapon* weapon = new Pistol.......

Пострелять, поперезаряжаться и тд.
Код для реализации:
#include
using namespace std;

// Если в классе есть хотя бы один абстрактный метод
// Класс становится абстрактным (нельзя создавать экземпляры)
class Figure {
public:

// Чисто виртуальный метод (В С++)
// Абстрактный метод (в других языках)
// он __ОБЯЗАН__ быть override-нут в дочернем классе
virtual float GetArea() = 0;
virtual float GetPerimeter() = 0;
};

class Rectangle : public Figure {

float width;
float height;

public:

Rectangle(float width, float height) {
this->width = width;
this->height = height;
}

float GetWidth() const {
return width;
}

float GetArea() override {
return width * height;
}
float GetPerimeter() override {
return 2 * (width + height);
}
};

class Circle : public Figure {
float radius;
const float PI = 3.14;

public:

Circle(float radius) {
this->radius = radius;
}

float GetRadius() const {
return radius;
}

float GetArea() override {
return PI * pow(radius, 2);
}
float GetPerimeter() override {
return 2 * PI * radius;
}
};

void PrintInfo(Figure* figure) {

cout << "Area:" << figure->GetArea() << endl;
cout << "Perimeter:" << figure->GetPerimeter() << endl;

}

int main() {

Figure* figure = new Circle(3);
figure->GetArea(); // cout

PrintInfo(new Rectangle(5, 8));

PrintInfo(new Circle(5));


}

Ответы на вопрос

Ответил Mirox921
1

Код:

#include <iostream>

class Weapon {

protected:

   int currentAmmo;

   int maxAmmo;

public:

   Weapon(int maxAmmo) : currentAmmo(maxAmmo), maxAmmo(maxAmmo) {}

   virtual void Shoot() = 0;

   virtual void Reload() = 0;

   int GetCurrentAmmo() const {

       return currentAmmo;

   }

   int GetMaxAmmo() const {

       return maxAmmo;

   }

};

class Pistol : public Weapon {

public:

   Pistol() : Weapon(12) {}

   void Shoot() override {

       if (currentAmmo >= 1) {

           std::cout << "Выстрел из пистолета. Осталось патронов: " << --currentAmmo << std::endl;

       } else {

           std::cout << "Патроны кончились. Перезарядитесь." << std::endl;

       }

   }

   void Reload() override {

       currentAmmo = maxAmmo;

       std::cout << "Пистолет перезарежен. Патронов: " << currentAmmo << std::endl;

   }

};

class AutomaticRifle : public Weapon {

public:

   AutomaticRifle() : Weapon(30) {}

   void Shoot() override {

       if (currentAmmo >= 3) {

           currentAmmo -= 3;

           std::cout << "Выстрел из автомата. Осталось патронов: " << currentAmmo << std::endl;

       } else {

           std::cout << "Патроны кончились. Перезарядитесь." << std::endl;

       }

   }

   void Reload() override {

       currentAmmo = maxAmmo;

       std::cout << "Автомат перезарежен. Патронов: " << currentAmmo << std::endl;

   }

};

int main() {

   Weapon* weapon;

   weapon = new Pistol();

   std::cout << "Пистолет. Патронов: " << weapon->GetCurrentAmmo() << "/" << weapon->GetMaxAmmo() << std::endl;

   weapon->Shoot();

   weapon->Shoot();

   weapon->Reload();

   weapon->Shoot();

   std::cout << std::endl;

   weapon = new AutomaticRifle();

   std::cout << "Автомат. Патронов: " << weapon->GetCurrentAmmo() << "/" << weapon->GetMaxAmmo() << std::endl;

   weapon->Shoot();

   weapon->Shoot();

   weapon->Reload();

   weapon->Shoot();

   delete weapon;

   

   return 0;

}

Новые вопросы