У нашому попередньому блозі ми детально розглянули світ абстракції. Тепер настав час розкрити наступну потужну особливість OOP, а саме Поліморфізм.
У цьому блозі ви отримуєте чітке розуміння Поліморфізму, його типів, віртуальних і чисто віртуальних функцій.
Тож приготуйтеся, адже ми вивчимо цю захопливу концепцію легко та цікаво! 🚀
Що таке Поліморфізм
- Визначення: Здатність змінної, функції чи об'єкта набувати різних форм.
- Приклад із реального життя: Зарядний пристрій для смартфона демонструє поліморфізм: він працює з різними пристроями, адаптуючись до їхніх потреб у заряджанні.
Після невеликого повторення базових понять, настав час дізнатися про типи поліморфізму
Типи Поліморфізму
1.
Поліморфізм часу компіляції (Static Binding)
- Визначається під час компіляції.
- Досягається за допомогою:
1. Перевантаження функцій: Функції з однаковим ім'ям, але різними типами аргументів та кількістю аргументів
2.
Перевантаження операторів: Оператори, що використовуються для користувацьких типів даних (наприклад, об’єктів).
Приклад: Перевантаження функцій
class Temp {
public:
void add(int x) { cout << "Adding int: " << x << endl; }
void add(double x) { cout << "Adding double: " << x << endl; }
void add(int x, int y) { cout << "Adding two ints: " << x + y << endl; }
};
int main() {
Temp t;
t.add(5); // Викликає add(int)
t.add(5.5); // Викликає add(double)
t.add(5, 10); // Викликає add(int, int)
return 0;
}
Приклад: Перевантаження операторів
class Count {
int value;
public:
Count(int v = 0) : value(v) {}
Count operator++() { return Count(++value); } // Перевантаження ++
void display() { cout << value << endl; }
};
int main() {
Count c(10);
++c;
c.display(); // Виведе: 11
return 0;
}
2. Поліморфізм часу виконання (Dynamic Binding)
- Визначається під час виконання.
- Досягається за допомогою:
1.
Перевизначення функцій (Function Overriding): Перевизначення методу базового класу в похідному класі.
2.
Віртуальні функції (Virtual Functions): Дозволяє визначати методи, які перевизначаються під час виконання програми.
Приклад: Без віртуальних функцій
class Polygon {
public:
int area() { return 0; } // Метод базового класу
};
class Rectangle : public Polygon {
public:
int area() { return 20; } // Перевизначений метод
};
int main() {
Polygon* poly = new Rectangle();
cout << poly->area(); // Виведення: 0 (Викликається метод базового класу)
return 0;
}
Приклад: З віртуальними функціями
class Polygon {
public:
virtual int area() { return 0; } // Ключове слово virtual
};
class Rectangle : public Polygon {
public:
int area() override { return 20; } // Правильно перевизначено
};
int main() {
Polygon* poly = new Rectangle();
cout << poly->area(); // Виведення: 20 (Викликається метод похідного класу)
return 0;
}
Віртуальні функції є ключем до досягнення поліморфізму, тому давайте розглянемо їх детальніше
Що таке віртуальна функція?
- Віртуальна функція в базовому класі дозволяє похідному класу перевизначити її.
- Вона забезпечує динамічне зв'язування, де функція для виконання визначається під час виконання програми.
Приклад:
#include using namespace std;
class Animal {
public:
virtual void sound() {
cout << "Тварина видає звук." << endl;
}
};
class Dog : public Animal {
public:
void sound() override {
cout << "Собака гавкає!" << endl;
}
};
int main() {
Animal* animalPtr;
Dog dogObj;
animalPtr = &dogObj;
animalPtr->sound(); // Викликається sound() собаки
return 0;
}
Виведення:
Собака гавкає!
Тепер, коли ми знаємо про віртуальні функції, давайте розглянемо їхню протилежність: чисто віртуальні функції.
Чисто віртуальні функції
- Віртуальна функція без реалізації в базовому класі.
- Змушує похідні класи реалізувати її.
- Оголошується за допомогою
= 0
.
Приклад:
class Base {
public:
virtual void func() = 0; // Чисто віртуальна функція
};
class Derived : public Base {
public:
void func() override { cout << "Всередині Derived" << endl; }
};
int main() {
Derived d;
d.func(); // Виведення: Всередині Derived
return 0;
}
Висновок
Поліморфізм забезпечує гнучкість та масштабованість в об'єктно-орієнтованому програмуванні, дозволяючи розробникам працювати з об'єктами більш загальним і повторно використовуваним способом.
Ми охопили всі основні принципи ООП.
Тепер давайте зміцнимо нашу основу з фінальною частиною серії. Тож не пропустіть наступний блог!!
Перекладено з: C++ OOPs: Polymorphism- One Shot