C++ ООП: Поліморфізм — Один погляд

pic

У нашому попередньому блозі ми детально розглянули світ абстракції. Тепер настав час розкрити наступну потужну особливість OOP, а саме Поліморфізм.

У цьому блозі ви отримуєте чітке розуміння Поліморфізму, його типів, віртуальних і чисто віртуальних функцій.

Тож приготуйтеся, адже ми вивчимо цю захопливу концепцію легко та цікаво! 🚀

Що таке Поліморфізм

  • Визначення: Здатність змінної, функції чи об'єкта набувати різних форм.
  • Приклад із реального життя: Зарядний пристрій для смартфона демонструє поліморфізм: він працює з різними пристроями, адаптуючись до їхніх потреб у заряджанні.

Після невеликого повторення базових понять, настав час дізнатися про типи поліморфізму

Типи Поліморфізму

pic

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

Leave a Reply

Your email address will not be published. Required fields are marked *