Різниця між перевантаженням функцій та перекриттям в C ++

Автор: Laura McKinney
Дата Створення: 1 Квітень 2021
Дата Оновлення: 11 Травень 2024
Anonim
Теорія C++ Урок 111. Перезавантаження арифметичних операторів
Відеоролик: Теорія C++ Урок 111. Перезавантаження арифметичних операторів

Зміст


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

Поліморфізм є однією з найважливіших особливостей ООП. Це просто означає "використання одного імені для кількох форм". Поліморфізм може бути реалізований за допомогою "перевантаження функцій", "перевантаження оператора" та "віртуальної функції". І «перевантаження», і «переоцінка» передбачають поняття поліморфізму. Тут "перевантаження" - це складання поліморфізму часу, а "переоцінка" - поліморфізм часу. Навчаючись далі, якщо говорити про головну різницю в "перевантаженні" та "переоціненні".


Далі ми вивчаємо різницю між перевантаженням і переосмисленням за допомогою таблиці порівняння.

  1. Порівняльна діаграма
  2. Визначення
  3. Ключові відмінності
  4. Схожість
  5. Висновок


Порівняльна діаграма:

Основа для порівнянняПеревантаженняПереважаючий
ПрототипПрототип відрізняється тим, що число чи тип параметра можуть відрізнятися.Усі аспекти прототипу повинні бути однаковими.
Ключове словоПід час перевантаження не застосовується ключове слово.Функція, яку потрібно переосмислити, передує ключовому слову віртуальний, в базовому класі.
Відмітний факторКількість або тип параметра відрізняється, що визначає виклик версії функції.Яка функція класів викликається вказівником, визначається, адреса якого класу об'єкт призначається цьому вказівнику.
Визначення візерункаФункції переосмислюються тим самим ім'ям, але різною кількістю та типом параметра.Функція визначена, передуючи ключовому слову віртуального в основному класі та переосмисленому похідним класом із ключовим словом.
Час виконанняЧас компіляції.Час виконання.
Конструктор / Віртуальна функціяКонструктори можуть бути перевантажені.Віртуальну функцію можна замінити.
Деструктор
Деструктор не можна перевантажувати.Деструктор можна перекрити.
Пов'язуванняПеренавантаження досягає раннього зв’язування.Переоцінка відноситься до пізнього зв'язування.


Визначення перевантаження

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

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

Здійснення перевантаження в C ++

перевантаження класу {int a, b; public: int load (int x) {// функція first load () a = x; повернути a; } int load (int x, int y) {// друга функція load () a = x; b = y; повернути a * b; }}; int main () {перевантаження O1; O1.load (20); // виклик функції першого завантаження () O1.load (20,40); // другий виклик функції load ()}

Тут функція load () класу перевантажена. Дві перевантажені функції класу можна виділити таким чином, що перша функція load () приймає лише один цілий параметр, тоді як друга функція load () приймає два цілих параметри. Коли об’єкт класу перевантаження викликає функцію load () з одним параметром, викликається перша функція load (). Коли об'єкт викликає функцію load (), яка передає два параметри, викликається друга функція load ().

Визначення перекриття

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

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

Впровадження переосмислення в C ++

class base {public: virtual void funct () {// віртуальна функція базового класу cout << "Це функція базових класів ()"; }}; клас похідний1: публічна база {public: void funct () {// віртуальна функція базового класу, переглянута у похідне1 клас cout << "Це похідний1 клас funct ()"; }}; клас производний2: публічна база {public: void funct () {// віртуальна функція базового класу, переосмислена у похідному2 класі cout << "Це похідне2 класу funct ()"; }}; int main () {база * p, b; похідне1 d1; похідне2 d2; * p = & b; p-> funct (); // виклик до базового класу funct (). * p = & d1; p-> funct (); // виклик до deriva1 класу funct (). * p = & d2; p-> funct (); // виклик до deriva2 класу funct (). повернути 0; }

Тут є єдиний базовий клас, який публічно успадковується двома похідними класами. Віртуальна функція визначається в базовому класі з ключовим словом "віртуальний", і вона переосмислюється обома похідними класами без ключового слова. У main () базовий клас створює змінну вказівника 'p' та об’єкт 'b'; Клас 'производний1' створює об’єкт d1, а клас222 створює об'єкт d2 '.

Тепер спочатку адреса об’єкта 'b' базового класу присвоюється покажчику базового класу 'p'. 'P' викликає функцію funct (), тому функція базового класу викликається.Потім адреса об’єкта похідного класу 'd1' присвоюється вказівнику 'p', і знову він викликає функцію (); тут виконується функція funct () похідного класу1. Нарешті, вказівник 'p' присвоюється об’єкту похідного класу2. Потім 'p' викликає функцію funct (), яка виконує функцію funct () похідного класу2.

Якби клас 1 / производний2 не переосмислював функцію (), тоді функцію () базового класу називали б, оскільки віртуальна функція є "ієрархічною".

  1. Прототип функції, яка перевантажується, відрізняється через тип і кількість параметрів, які передаються перевантаженій функції. З іншого боку, прототип перекритої функції не змінюється, оскільки переосмислена функція виконує різні дії для іншого класу, до якого вона належить, але з тим самим типом і кількістю параметрів.
  2. Перевантажене ім’я функції не передує жодному ключовому слову, тоді як ім'я перекритої функції передує клавіатурі "Віртуальний" лише в базовому класі.
  3. Яка перевантажена функція викликається, залежить від типу або кількості параметра, який передається функції. Перевиконана функція класу, на яку викликається, залежить від того, адреса об'єкта якого класу призначена покажчику, який викликав функцію.
  4. На яку функцію потрібно перезавантажити, вирішується під час компіляції. Яка переосмислена функція, яку слід викликати, вирішується під час виконання.
  5. Конструктори можуть бути перевантажені, але не можна їх перекривати.
  6. Деструктори не можна перевантажувати, але їх можна перекрити.
  7. Перевантаження перетворюється на раннє прив'язування, оскільки виклик перевантаженої функції вирішується під час компіляції. Переосмислення досягає пізнього зв'язування, оскільки виклик функції, що перекривається, вирішується під час виконання.

Схожість

  1. Обидва застосовані до функцій-членів класу.
  2. Поліморфізм - основна концепція обох.
  3. Ім'я функції залишається таким же, поки ми застосовуємо перевантаження та переосмислення функцій.

Висновок

Перевантаження та переосмислення здаються схожими, але це не так. Функції можуть бути перевантажені, але будь-який клас не може в подальшому перевизначати перевантажену функцію в майбутньому. Віртуальну функцію не можна перевантажувати; їх можна лише перекрити.