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));
}
Ответы на вопрос
Код:
#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;
}