Поліморфізм С ++ на прикладі

Зміст:

Anonim

Що таке поліморфізм у C ++?

У C ++ поліморфізм змушує функцію-член поводитися по-різному залежно від об’єкта, який його викликає / викликає. Поліморфізм - грецьке слово, що означає мати багато форм. Це відбувається, коли у вас є ієрархія класів, пов’язаних через успадкування.

Наприклад, припустимо, у нас є функція makeSound (). Коли кішка викликає цю функцію, вона видасть звук нявкання. Коли корова викликає ту саму функцію, вона видаватиме звук косу.

Хоча у нас одна функція, вона поводиться по-різному за різних обставин. Функція має багато форм; отже, ми досягли поліморфізму.

У цьому підручнику з C ++ ви дізнаєтесь:

  • Що таке поліморфізм?
  • Види поліморфізму
  • Складіть поліморфізм часу
  • Перевантаження функції
  • Перевантаження оператора
  • Поліморфізм часу виконання
  • Перевизначення функції
  • Віртуальна функція C ++
  • Поліморфізм часу компіляції проти Поліморфізм під час виконання

Види поліморфізму

С ++ підтримує два типи поліморфізму:

  • Поліморфізм під час компіляції та
  • Поліморфізм виконання.

Складіть поліморфізм часу

Ви викликаєте перевантажені функції, збігаючи кількість і тип аргументів. Інформація присутня під час компіляції. Це означає, що компілятор C ++ обере правильну функцію під час компіляції.

Поліморфізм часу компіляції досягається за рахунок перевантаження функцій та перевантаження оператора.

Перевантаження функції

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

Приклад 1:

#include using namespace std;void test(int i) {cout << " The int is " << i << endl;}void test(double f) {cout << " The float is " << f << endl;}void test(char const *ch) {cout << " The char* is " << ch << endl;}int main() {test(5);test(5.5);test("five");return 0;}

Вихід:

Ось скріншот коду:

Пояснення коду:

  1. Включіть файл заголовка iostream до нашого коду. Ми зможемо використовувати його функції.
  2. Включіть простір імен std у наш код. Ми зможемо використовувати його класи, не викликаючи його.
  3. Створіть функцію з іменем test, яка приймає цілочисельний параметр i. Значок {позначає початок основного тесту функції.
  4. Заява, яка повинна бути виконана, якщо виклик / виклик вищезазначеного тесту функції.
  5. Кінець тіла вищезазначеного функціонального тесту.
  6. Створіть функцію з іменем test, яка приймає плаваючий параметр f. Значок {позначає початок основного тесту функції.
  7. Заява, яка повинна бути виконана, якщо виклик / виклик вищезазначеного тесту функції.
  8. Кінець тіла вищезазначеного тесту на функцію.
  9. Створіть функцію з іменем test, яка приймає символьний параметр ch. Значок {позначає початок основного тесту функції.
  10. Заява, яка повинна бути виконана, якщо виклик / виклик вищезазначеного тесту функції.
  11. Кінець тіла вищезазначеного тесту на функцію.
  12. Виклик функції main (). Значок {позначає початок тіла функції.
  13. Викликаємо функціональний тест і передаємо йому 5 як значення аргументу. Це викликає тестову функцію, яка приймає цілочисельний аргумент, тобто першу тестову функцію.
  14. Викликаємо функціональний тест і передаємо йому 5.5 як значення аргументу. Це викличе тестову функцію, яка приймає аргумент з плаваючою точкою, тобто другу тестову функцію.
  15. Викликаємо функціональний тест і передаємо йому п’ять як значення аргументу. Це викличе функцію тесту, яка приймає аргумент символу, тобто третю функцію тесту.
  16. Якщо програма успішно працює, програма повинна повернути значення.
  17. Кінець тіла основної () функції.

У нас є три функції з однаковою назвою, але різні типи аргументів. Ми досягли поліморфізму.

Перевантаження оператора

У перевантаженні оператора ми визначаємо нове значення для оператора С ++. Це також змінює спосіб роботи оператора. Наприклад, ми можемо визначити оператор + для об'єднання двох рядків. Ми знаємо його як оператор додавання для додавання числових значень. Після нашого визначення, коли воно розміщується між цілими числами, воно додасть їх. При розміщенні між рядками він об'єднує їх.

Приклад 2:

#includeusing namespace std;class ComplexNum {private:int real, over;public:ComplexNum(int rl = 0, int ov = 0) {real = rl;over = ov;}ComplexNum operator + (ComplexNum const &obj) {ComplexNum result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){ComplexNum c1(10, 2), c2(3, 7);ComplexNum c3 = c1+c2;c3.print();}

Вихід:

Ось скріншот коду:

Пояснення коду:

  1. Включіть файл заголовка iostream до нашої програми, щоб використовувати його функції.
  2. Включіть простір імен std у нашу програму, щоб використовувати її класи, не викликаючи його.
  3. Створіть клас з іменем ComplexNum. Значок {позначає початок тіла класу.
  4. Використовуйте модифікатор приватного доступу, щоб позначити змінні як приватні, тобто доступ до них доступний лише з класу.
  5. Визначте дві цілочисельні змінні, реальну та більше.
  6. Використовуйте модифікатор загального доступу, щоб позначити конструктор як загальнодоступний, що означає, що він буде доступний навіть поза межами класу.
  7. Створіть конструктор класу та ініціалізуйте змінні.
  8. Ініціалізуйте значення змінної real.
  9. Ініціалізуйте значення змінної над.
  10. Кінець тіла конструктора.
  11. Нам потрібно замінити значення оператора +.
  12. Створіть результат типу даних типу ComplexNum.
  13. Використовуйте оператор + із комплексними числами. Цей рядок додасть дійсну частину числа до реальної частини іншого числа.
  14. Використовуйте оператор + із комплексними числами. Цей рядок додасть уявну частину числа до уявної частини іншого числа.
  15. Після успішного виконання програма поверне значення змінної результату.
  16. Кінець визначення нового значення оператора +, тобто перевантаження.
  17. Викличте метод print ().
  18. Надрукуйте новий комплексний номер після додавання на консолі.
  19. Кінець функції основного тексту print ().
  20. Кінець тіла класу ComplexNum.
  21. Виклик функції main ().
  22. Передайте значення як дійсних, так і складних частин, які слід додати. Перша частина c1 буде додана до першої частини c2, тобто 10 + 3. Друга частина c1 буде додана до другої частини c, тобто 2 + 7.
  23. Виконайте операцію, використовуючи оператор overloaded + та зберігаючи результат у змінній c3.
  24. Надрукуйте значення змінної c3 на консолі.
  25. Кінець тіла основної () функції.

Поліморфізм часу виконання

Це трапляється, коли метод об'єкта викликається / викликається під час виконання, а не під час компіляції. Поліморфізм часу виконання досягається завдяки перевизначенню функції. Функція, яку потрібно викликати / викликати, встановлюється під час виконання.

Перевизначення функції

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

Наприклад:

#include using namespace std;class Mammal {public:void eat() {cout << "Mammals eat… ";}};class Cow: public Mammal {public:void eat() {cout << "Cows eat grass… ";}};int main(void) {Cow c = Cow();c.eat();return 0;}

Вихід:

Ось скріншот коду:

Пояснення коду:

  1. Імпортуйте файл заголовка iostream до нашої програми, щоб використовувати його функції.
  2. Включіть простір імен std у нашу програму, щоб використовувати її класи, не викликаючи його.
  3. Створіть клас на ім’я Ссавці. Значок {позначає початок тіла класу.
  4. Використовуйте модифікатор загального доступу, щоб встановити функцію, яку ми збираємось створити, як загальнодоступну. Він буде доступний поза межами цього класу.
  5. Створіть загальнодоступну функцію з назвою eat. Значок {позначає початок тіла функції.
  6. Роздрукуйте оператор, доданий до функції cout, коли викликається функція eat ().
  7. Кінець тіла функції їсти ().
  8. Кінець тіла класу Ссавці.
  9. Створіть клас на ім’я Корова, який успадковує клас Ссавців. Корова - похідний клас, тоді як ссавці - базовий. Значок {означає початок цього заняття.
  10. Використовуйте модифікатор загального доступу, щоб позначити функцію, яку ми збираємось створити, як загальнодоступну. Він буде доступний поза межами цього класу.
  11. Перевизначити функцію eat (), визначену в базовому класі. Значок {позначає початок тіла функції.
  12. Оператор для друку на консолі, коли ця функція викликається.
  13. Кінець тіла функції eat ().
  14. Кінець тіла класу Корова.
  15. Виклик функції main (). Значок {позначає початок основи цієї функції.
  16. Створіть екземпляр класу Cow та дайте йому назву c.
  17. Викличте функцію eat (), визначену в класі Cow.
  18. Після успішного завершення програма повинна повернути значення.
  19. Кінець функції main ().

Віртуальна функція C ++

Віртуальна функція - ще один спосіб реалізації поліморфізму під час виконання в C ++. Це спеціальна функція, визначена в базовому класі та перевизначена у похідному класі. Щоб оголосити віртуальну функцію, слід використовувати віртуальне ключове слово. Ключове слово має передувати оголошенню функції в базовому класі.

Якщо клас віртуальної функції успадковується, віртуальний клас перевизначає віртуальну функцію відповідно до її потреб. Наприклад:

#include using namespace std;class ClassA {public:virtual void show() {cout << "The show() function in base class invoked… " << endl;}};class ClassB :public ClassA {public:void show() {cout << "The show() function in derived class invoked… ";}};int main() {ClassA* a;ClassB b;a = &b;a->show();}

Вихід:

Ось скріншот коду:

Пояснення коду:

  1. Включіть файл заголовка iostream до коду, щоб використовувати його функції.
  2. Включіть у наш код простір імен std, щоб використовувати його класи, не викликаючи його.
  3. Створіть клас з іменем ClassA.
  4. Використовуйте модифікатор загального доступу, щоб позначити учасника класу як загальнодоступного.
  5. Створіть віртуальну функцію з іменем show (). Це буде публічна функція.
  6. Текст, який буде надруковано під час виклику show (). Endl - це ключове слово C ++, що означає кінцевий рядок. Він переміщує курсор миші до наступного рядка.
  7. Кінець тіла віртуальної функції show ().
  8. Кінець тіла класу ClassA.
  9. Створення нового класу з іменем ClassB, який успадковує клас ClassA. ClassA стає базовим класом, тоді як ClassB стає похідним класом.
  10. Використовуйте модифікатор загального доступу, щоб позначити учасника класу як загальнодоступного.
  11. Перевизначте віртуальну функцію show (), отриману в базовому класі.
  12. Текст для друку на консолі при виклику функції show (), визначеної у похідному класі.
  13. Кінець основного елемента функції show ().
  14. Кінець тіла похідного класу, ClassB.
  15. Виклик функції main (). Логіка програми повинна бути додана до її тіла.
  16. Створіть змінну покажчика з іменем a. Це вказує на клас з назвою ClassA.
  17. Створіть екземпляр класу з іменем ClassB. Екземпляру присвоєно назву b.
  18. Призначити сховища значень у адресі b у змінній a.
  19. Виклик функції show (), визначеної у похідному класі. Впроваджено пізню прив'язку.
  20. Кінець тіла основної () функції.

Поліморфізм часу компіляції проти Поліморфізм під час виконання

Ось основні відмінності між ними:

Компілятивний поліморфізм Поліморфізм під час виконання
Це також називають ранньою зв'язкою або статичним поліморфізмом Його також називають пізнім / динамічним зв'язуванням або динамічним поліморфізмом
Метод викликається / викликається під час компіляції Метод викликається / викликається під час виконання
Реалізовано через перевантаження функцій та перевантаження оператора Реалізовано за допомогою перевизначення методу та віртуальних функцій
Приклад, метод перевантаження. Багато методів можуть мати схожі назви, але різну кількість або типи аргументів Приклад, перевизначення методу. Багато методів можуть мати схожу назву та однаковий прототип.
Швидше виконання, оскільки виявлення методів здійснюється під час компіляції Повільніше виконання, оскільки метод виявлення методу виконується під час виконання.
Менше гнучкості для вирішення проблем, оскільки все відомо під час компіляції. Для вирішення складних проблем забезпечується велика гнучкість, оскільки методи відкриваються під час виконання.

Короткий зміст:

  • Поліморфізм означає мати багато форм.
  • Це відбувається, коли існує ієрархія класів, пов’язаних за допомогою успадкування.
  • При поліморфізмі функція може поводитися по-різному залежно від об’єкта, який її викликає / викликає.
  • У поліморфізмі під час компіляції функція, яку потрібно викликати, встановлюється під час компіляції.
  • У поліморфізмі під час виконання функція, яку потрібно викликати, встановлюється під час виконання.
  • Поліморфізм часу компіляції визначається через перевантаження функцій та перевантаження оператора.
  • У перевантаженні функцій є багато функцій з однаковими іменами, але різними аргументами.
  • Параметри можуть відрізнятися за кількістю або типом.
  • У перевантаженні оператора визначається нове значення для операторів С ++.
  • Поліморфізм часу виконання досягається завдяки перевизначенню функції.
  • При перевизначенні функції похідний клас дає нове визначення функції, визначеної в базовому класі.