Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 🔹 Задача 1. **Базовая реализация полиморфизма**
- **Условие**:
- Создайте базовый класс `Figure` с виртуальной функцией `draw()`. Создайте два производных класса: `Circle` и `Square`, переопределяющих `draw()`. Продемонстрируйте вызов правильной версии функции через указатель на базовый класс.
- #include <iostream>
- using namespace std;
- // напишите решение ниже
- int main() {
- Circle c;
- Square s;
- Figure* f1 = &c;
- Figure* f2 = &s;
- f1->draw(); // Рисую круг
- f2->draw(); // Рисую квадрат
- }
- > 💡 **Обучение**: Демонстрация базового полиморфизма через виртуальные функции.
- ---
- ## 🔹 Задача 2. **Чисто виртуальная функция и абстрактный класс**
- **Условие**:
- Создайте абстрактный класс `Animal` с чисто виртуальной функцией `makeSound()`. Реализуйте классы `Dog` и `Cat`, которые переопределяют эту функцию. Попытайтесь создать объект `Animal` — объясните ошибку.
- #include <iostream>
- using namespace std;
- // напишите решение ниже
- int main() {
- Dog d;
- Cat c;
- Animal* a1 = &d;
- Animal* a2 = &c;
- a1->makeSound(); // Гав!
- a2->makeSound(); // Мяу!
- // Animal a; // ❌ Ошибка: нельзя создать объект абстрактного класса
- }
- > 💡 **Обучение**: Абстрактные классы задают интерфейс, но не могут создавать объекты.
- ---
- ## 🔹 Задача 3. **Виртуальный деструктор — демонстрация важности**
- **Условие**:
- Создайте базовый класс `Base` и производный `Derived`, оба с деструкторами, выводящими сообщение. Создайте объект `Derived`, удалите его через указатель на `Base`. Сначала без виртуального деструктора, затем с ним. Сравните результат.
- #include <iostream>
- using namespace std;
- // Без virtual
- // напишите решение ниже
- // С virtual
- // напишите решение ниже
- int main() {
- cout << "Без virtual:\n";
- Base1* p1 = new Derived1();
- delete p1; // Вывод: ~Base1() — деструктор Derived НЕ вызван!
- cout << "\nС virtual:\n";
- Base2* p2 = new Derived2();
- delete p2; // Вывод: ~Derived2(), затем ~Base2()
- }
- > 💡 **Обучение**: Без виртуального деструктора — утечка ресурсов и неопределённое поведение.
- ---
- ## 🔹 Задача 4. **Полиморфная коллекция объектов**
- **Условие**:
- Создайте вектор указателей на базовый класс `Shape` (с чисто виртуальной функцией `area()`). Добавьте в него объекты `Circle` и `Rectangle`. Выведите площадь каждой фигуры.
- #include <iostream>
- #include <vector>
- #include <cmath>
- using namespace std;
- // напишите решение ниже
- int main() {
- vector<Shape*> shapes;
- shapes.push_back(new Circle(2.0));
- shapes.push_back(new Rectangle(3.0, 4.0));
- for (const auto& shape : shapes) {
- cout << "Площадь: " << shape->area() << endl;
- }
- // Очистка памяти
- for (auto* s : shapes) delete s;
- }
- > 💡 **Обучение**: Работа с коллекцией полиморфных объектов.
- ---
- ## 🔹 Задача 5. **Использование `override` для защиты от ошибок**
- **Условие**:
- Создайте базовый класс `Vehicle` с виртуальной функцией `startEngine()`. В производном классе `Car` попытайтесь переопределить функцию с опечаткой (`startEngin`). Используйте `override` и покажите, как компилятор ловит ошибку.
- // напишите решение ниже
- > 💡 **Обучение**: `override` защищает от случайных ошибок при переопределении.
- ---
- ## 🔹 Задача 6. **Вызов виртуальной функции из конструктора/деструктора**
- **Условие**:
- Создайте базовый класс `Base` и производный `Derived`. В конструкторе `Base` вызовите виртуальную функцию `foo()`. Объясните, какая версия функции вызовется и почему.
- #include <iostream>
- using namespace std;
- // напишите решение ниже
- int main() {
- Derived d;
- }
- **Вывод**:
- Base::foo()
- Derived::foo()
- > 💡 **Обучение**: Во время выполнения конструктора базового класса объект **ещё не является** объектом производного класса → вызывается версия базового класса.
- ---
- ## 🔹 Задача 7. **Интерфейсный класс (все функции чисто виртуальные)**
- **Условие**:
- Создайте интерфейс `Drawable` с функцией `draw() = 0` и `Printable` с `print() = 0`. Создайте класс `Text`, реализующий оба интерфейса.
- #include <iostream>
- using namespace std;
- // напишите решение ниже
- int main() {
- Text t;
- Drawable* d = &t;
- Printable* p = &t;
- d->draw(); // Drawing text
- p->print(); // Printing text
- }
- > 💡 **Обучение**: Множественное наследование от интерфейсов — безопасно и полезно.
- ---
- ## 🔹 Задача 8. **Полиморфизм с использованием ссылок**
- **Условие**:
- Перепишите задачу 1, но используйте **ссылки** вместо указателей для демонстрации полиморфизма.
- #include <iostream>
- using namespace std;
- // напишите решение ниже
- int main() {
- Cow cow;
- makeItSound(cow); // Moo!
- }
- > 💡 **Обучение**: Полиморфизм работает и со ссылками, и с указателями.
- ---
- ## 🔹 Задача 9. **Виртуальные функции и наследование более чем одного уровня**
- **Условие**:
- Создайте иерархию: `Animal` → `Mammal` → `Dog`. Все имеют виртуальную функцию `speak()`. Покажите, что вызывается версия самого "глубокого" класса.
- #include <iostream>
- using namespace std;
- // напишите решение ниже
- int main() {
- Dog dog;
- Animal* a = &dog;
- a->speak(); // Woof!
- }
- > 💡 **Обучение**: Виртуальность наследуется по всей цепочке.
- ---
- ## 🔹 Задача 10. **Полиморфизм с умными указателями**
- **Условие**:
- Перепишите задачу 4, используя `std::unique_ptr` вместо сырых указателей.
- #include <iostream>
- #include <vector>
- #include <memory>
- #include <cmath>
- using namespace std;
- // напишите решение ниже
- int main() {
- vector<unique_ptr<Shape>> shapes;
- shapes.push_back(make_unique<Circle>(1.0));
- shapes.push_back(make_unique<Square>(2.0));
- for (const auto& shape : shapes) {
- cout << "Area: " << shape->area() << endl;
- }
- // Память освобождается автоматически
- }
- ===========================================================
- ### **Задача 1: Управление транспортными средствами**
- **Описание:** Создайте иерархию классов для различных видов транспорта (`Vehicle`, `Car`, `Bicycle`, `Airplane`). У каждого транспорта есть метод `move()`, который ведёт себя по-разному.
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<Vehicle*> fleet = {new Car, new Bicycle, new Airplane};
- for (auto v : fleet) {
- v->move();
- }
- for (auto v : fleet) {
- delete v;
- }
- return 0;
- }
- ---
- ### **Задача 2: Обработка платежей**
- **Описание:** Создайте систему обработки платежей (`Payment`, `CreditCard`, `PayPal`, `BankTransfer`), где каждый метод обработки отличается.
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<Payment*> payments = {new CreditCard, new PayPal, new BankTransfer};
- for (auto p : payments) {
- p->process();
- }
- for (auto p : payments) {
- delete p;
- }
- return 0;
- }
- ---
- ### **Задача 3: Рисование фигур**
- **Описание:** Используйте виртуальные функции для рисования различных геометрических фигур (`Shape`, `Circle`, `Rectangle`, `Triangle`), каждая из которых реализует метод `draw()` по-своему.
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<Shape*> shapes = {new Circle, new Rectangle, new Triangle};
- for (auto s : shapes) {
- s->draw();
- }
- for (auto s : shapes) {
- delete s;
- }
- return 0;
- }
- ---
- ### **Задача 4: Животные и звуки**
- **Описание:** Класс `Animal` с виртуальной функцией `makeSound()`, реализованной в подклассах (`Dog`, `Cat`, `Cow`).
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<Animal*> animals = {new Dog, new Cat, new Cow};
- for (auto a : animals) {
- a->makeSound();
- }
- for (auto a : animals) {
- delete a;
- }
- return 0;
- }
- ---
- ### **Задача 5: Управление файлами**
- **Описание:** Имитация обработки файлов разных типов (`File`, `TextFile`, `ImageFile`, `VideoFile`), где каждый тип файла имеет свой метод `open()`.
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<File*> files = {new TextFile, new ImageFile, new VideoFile};
- for (auto f : files) {
- f->open();
- }
- for (auto f : files) {
- delete f;
- }
- return 0;
- }
- ---
- ### **Задача 6: Управление сотрудниками**
- **Описание:** Различные типы сотрудников (`Employee`, `Manager`, `Engineer`, `Salesperson`) с разными методами `work()`.
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<Employee*> staff = {new Manager, new Engineer, new Salesperson};
- for (auto e : staff) {
- e->work();
- }
- for (auto e : staff) {
- delete e;
- }
- return 0;
- }
- ---
- ### **Задача 7: Работа с фигурами (с вычислением площади)**
- **Описание:** Используйте виртуальные функции для вычисления площади разных фигур (`Shape`, `Circle`, `Rectangle`).
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<Shape*> shapes = {new Circle(5), new Rectangle(4, 6)};
- for (auto s : shapes) {
- std::cout << "Area: " << s->getArea() << "\n";
- }
- for (auto s : shapes) {
- delete s;
- }
- return 0;
- }
- ---
- ### **Задача 8: Игровые персонажи**
- **Описание:** Игровые персонажи (`Character`, `Warrior`, `Mage`, `Archer`) с уникальным методом `attack()`.
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<Character*> party = {new Warrior, new Mage, new Archer};
- for (auto c : party) {
- c->attack();
- }
- for (auto c : party) {
- delete c;
- }
- return 0;
- }
- ---
- ### **Задача 9: Печать документов**
- **Описание:** Различные типы документов (`Document`, `PDF`, `Word`, `ImageDoc`) с разными способами печати.
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<Document*> docs = {new PDF, new Word, new ImageDoc};
- for (auto d : docs) {
- d->print();
- }
- for (auto d : docs) {
- delete d;
- }
- return 0;
- }
- ```
- ---
- ### **Задача 10: Управление устройствами**
- **Описание:** Устройства (`Device`, `Phone`, `Laptop`, `Tablet`) с методом `turnOn()`.
- #include <iostream>
- #include <vector>
- // ваше решение ниже
- int main() {
- std::vector<Device*> devices = {new Phone, new Laptop, new Tablet};
- for (auto d : devices) {
- d->turnOn();
- }
- for (auto d : devices) {
- delete d;
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment