Рекомендуємо, 2024

Вибір Редакції

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

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

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


Діаграма порівняння:

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

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

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

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

Реалізація перевантаження в C ++

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

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

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

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

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

Реалізація перевизначення в C ++

 class base {public: virtual void funct () {// віртуальна функція базового класу cout << "Це функція базового класу ()"; }}; клас виходе1: public base {public: void funct () {// віртуальна функція базового класу перевизначена у class1 вирахування класу cout << "Це funct ()" класу выведені1 "; }}; клас-вихід2: public base {public: void funct () {// віртуальна функція базового класу, що перевизначається в класі derivat class  funct (); // виклик funct (). * p = & d2; p-> funct (); // виклик funct (). return 0; } 

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

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

Якщо class1 не було перевизначено funct (), то було б викликано funct () базового класу, оскільки віртуальна функція є ієрархічною.

Ключові відмінності між перевантаженням і перевизначенням

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

Подібності

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

Висновок

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

Top