Предмет: Информатика, автор: Kukuwka0Ha0DepeBe

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;

}

Похожие вопросы
Предмет: Русский язык, автор: Heruka
СРОЧНО!!! ДАЮ 100 БАЛЛОВ
Напишите сочинение рассужднние по тексту :
Жизнь человека – череда многочисленных выборов. Серьёзных, от которых зависит будущее (например, выбор спутника жизни), и повседневных, бытовых (что приготовить на ужин – запеканку или овощное рагу). Выбор профессии можно отнести, пожалуй, к самым сложным. Ведь это и выбор того, какое место займёт профессия в жизни человека, что он сможет получить от своей будущей работы, как особенности специальности будут соотноситься с другими жизненными ценностями и планами, не станет ли профессия им мешать.

Так, девушка с детства мечтала поступить в юридическую академию и работать следователем. Желание исполнилось. Обучение в институте – сплошное удовольствие: интересные предметы, предвкушение увлекательной и неординарной работы, да и милицейская форма ей к лицу. Ближе к окончанию академии девушку стали посещать мысли о создании семьи, рождении детей. Надо сказать, что без гармоничной и благополучной семьи свою жизнь она также не представляла. Однако профессия следователя предполагает ненормированный и напряжённый рабочий день, нередки ночные выезды, неотложные командировки. Естественно, что времени на семью не хватает. В такой ситуации неизбежно возникло противоречие между двумя жизненными целями. Конечно, это не означает, что все следователи, геологи, капитаны дальнего плавания вынуждены постоянно «разрываться» между работой и семьёй. Однако, выбирая профессию, человек должен заранее представлять себе её специфику и возможные трудности. Тогда он сможет найти компромисс, а в результате и «овцы будут целы, и волки сыты».

Выбор профессии, с одной стороны, взгляд в будущее (хотя бы недалёкое): чем я хочу заниматься, какие сложности могут встретиться на пути в профессию? А с другой – взгляд внутрь себя: насколько я готов преодолевать препятствия для достижения цели?