Разлика между функция Претоварване и преодоляване в C ++

Автор: Laura McKinney
Дата На Създаване: 1 Април 2021
Дата На Актуализиране: 11 Може 2024
Anonim
Which Type of Protein is Better for Our Kidneys?
Видео: Which Type of Protein is Better for Our Kidneys?

Съдържание


В „претоварване„Предефинираме претоварените функции със същото име на функция, но с различен брой и тип параметри. В „първостепенни„Прототип на отменена функция е един и същ в цялата програма, но функцията, която трябва да бъде отменена, се предхожда от ключовата дума„ виртуален “в базовия клас и се предефинира от извлечения клас без каквато и да е ключова дума.

Полиморфизмът е една от основните характеристики на OOP. Това просто означава „използване на едно име за няколко форми“. Полиморфизмът може да бъде приложен с помощта на „претоварване на функции“, „претоварване на оператор“ и „виртуална функция“. И двете, "претоварване" и "пренатоварване" предполага концепцията за полиморфизъм. Тук „претоварването“ е полиморфизъм във времето, а „преодоляване“ е полиморфизъм във времето. Изучавайки по-нататък, ако говорим за основната разлика в „претоварването“ и „преодоляването“.

По-нататък ние изучаваме разликата между претоварването и преодоляването с помощта на сравнителна диаграма.


  1. Сравнителна диаграма
  2. дефиниция
  3. Ключови разлики
  4. прилики
  5. заключение


Сравнителна диаграма:

Основа за сравнениеПретоварванетоЗамяната
прототипПрототипът се различава, тъй като числото или типът на параметъра могат да се различават.Всички аспекти на прототипа трябва да са еднакви.
Ключова думаНе се прилага ключова дума по време на претоварване.Функцията, която трябва да се отмени, се предхожда от виртуална ключова дума в базовия клас.
Разграничителен факторНомер или тип параметър се различава, което определя версията на функцията да се извиква.Коя функция от класове се извиква от показалеца, се определя от адреса на кой клас клас е присвоен на този показалец.
Дефиниращ моделФункцията се предефинира със същото име, но различен брой и тип параметър.Функцията е дефинирана, предшествана от ключова дума виртуална в основния клас и предефинирана от производен клас с външна ключова дума.
Време на изпълнениеВреме за компилиране.Време за изпълнение.
Конструктор / Виртуална функцияКонструкторите могат да бъдат претоварени.Виртуалната функция може да бъде отменена.
пещ за горене на отпадъци
Деструкторът не може да бъде претоварен.Деструкторът може да бъде отменен.
подвързванеПретоварването постига ранно свързване.Повишаването се отнася до късно свързване.


Определение за претоварване

Полиморфизмът във време на компилация се нарича „претоварване.“ Тъй като претоварването се генерира от концепция за полиморфизъм, той осигурява „общ интерфейс за множество методи“. Това означава, че ако дадена функция е претоварена, тя съдържа същото име на функция, докато е предефинирана.

Претоварените функции се различават по отношение на, различен „брой или тип параметри (и)“, това прави една претоварена функция различна от друга. По този начин компилаторът разпознава коя претоварена функция се извиква. Най-често претоварените функции са „конструктори“. „Конструктор на копиране“ е вид „претоварване на конструктора“.

Изпълнение на претоварване в C ++

клас претоварване {int a, b; public: int load (int x) {// първа функция load () a = x; връщане a; } int load (int x, int y) {// секунда функция () функция a = x; б = Y; върнете a * b; }}; int main () {претоварване O1; O1.load (20); // първо извикване на функция load () O1.load (20,40); // второ извикване на функция load ()}

Тук функцията load () на клас претоварване е претоварена. Двете претоварени функции на класа могат да бъдат разграничени по начин, че първата функция load () приема само един параметър за цяло число, докато втората функция load () приема два параметъра за цяло число. Когато обектът от класа претоварване извиква функцията load () с един параметър, първо се извиква функцията load (). Когато обектът извиква функция load (), преминаваща два параметъра, се извиква функция за второ зареждане ().

Определение за отменяне

Полиморфизмът, постигнат по време на изпълнение, се нарича „преодоляване.“ Той се осъществява чрез използване на „наследяване“ и „виртуални функции“. Функцията, която трябва да бъде отменена, се предхожда от ключовата дума „виртуален“ в основен клас и се предефинира в производен клас без никаква ключова дума.

Едно от най-важните неща, които трябва да запомните в случай на преодоляване, е, че прототипът на презаписаната функция не трябва да се променя, докато изведеният клас я предефинира. Когато пренасочената функция получава повикване, C ++ определя коя версия на функцията се извиква въз основа на „типа на обекта, посочен с показалец“, чрез който се извършва извикването на функцията.

Изпълнение на преодоляване в C ++

клас база {public: виртуален void funct () {// виртуална функция на базовия клас cout << "Това е функция на базови класове ()"; }}; клас производен1: публична база {public: void funct () {// виртуална функция на базовия клас, предефинирана в deri1 class cout << "Това е производен1 клас funct ()"; }}; клас производна2: публична база {public: void funct () {// виртуална функция на базов клас, предефинирана в производно c class cout << "Това е производна2 клас функции ()"; }}; int main () {база * p, b; производно1 d1; производно2 d2; * = Р и б; р> Funct (); // извикване към базовия клас funct (). * Р = & d1; р> Funct (); // извикване към производния функция1 клас (). * Р = & d2; р> Funct (); // извикване към производния функция2 клас (). връщане 0; }

Тук има един основен клас, който се наследява публично от два производни класа. Виртуална функция се дефинира в основен клас с ключова дума „виртуален“ и се предефинира от двата производни класа без ключова дума. В main (), базовият клас създава променлива показалец 'p' и обект 'b'; Класът 'deri1' създава обект d1, а deri2 клас създава обект d2 '.

Сега първоначално адресът на обекта 'b' на базовия клас е присвоен на показалеца на базовия клас 'p'. 'P' извиква функцията funct (), така че се извиква функция от базовия клас.Тогава адресът на производния обект от клас 'd1' се присвоява на показалец 'p', отново той призовава към функция (); тук се изпълнява функцията funct () на производния1 клас. И накрая, показалецът „p“ е присвоен на обекта на произволен клас 2 Тогава 'p' извиква функция funct (), която изпълнява функцията funct () на производния клас2.

Ако class1 / izved2 клас не предефинира funct (), тогава funct () на базовия клас щеше да бъде извикан, тъй като виртуалната функция е „йерархична.“

  1. Прототипът на функция, която се претоварва, се различава поради вида и броя на параметрите, които се предават на претоварената функция. От друга страна, прототипът на презаписаната функция не се променя, тъй като една отменена функция изпълнява различно действие за различен клас, към който принадлежи, но с един и същ тип и брой параметри.
  2. Името на претоварената функция не предхожда с никоя ключова дума, докато името на надменена функция предхожда само от клавиатурата „Виртуален“ само в базовия клас.
  3. Коя презаредена функция се извиква зависи от типа или броя на параметъра, който се предава на функцията. Заменената функция на кой клас се извиква зависи от това, кой адрес на обект на клас е присвоен на показалеца, който е извикал функцията.
  4. Коя претоварена функция да бъде извикана се решава по време на компилиране. Коя отменена функция за извикване се разрешава по време на изпълнение.
  5. Конструкторите могат да бъдат претоварени, но не могат да бъдат пренатоварени.
  6. Деструкторите не могат да бъдат претоварени, но могат да бъдат преодолени.
  7. Претоварването постига ранно свързване, тъй като коя претоварена функция ще бъде извикана се разрешава по време на компилиране. При преодоляване се постига късно свързване, тъй като коя отменената функция ще бъде извикана е разрешена по време на изпълнение.

прилики

  1. И двете се прилагат към членски функции на клас.
  2. Полиморфизмът е основната концепция зад двамата.
  3. Името на функцията остава същото, докато прилагаме претоварване и преодоляване на функциите.

заключение

Изглежда, че претоварването и презаписването са подобни, но това не е така. Функциите могат да бъдат претоварени, но всеки клас не може да предефинира допълнително претоварената функция в бъдеще. Виртуална функция не може да бъде претоварена; те могат да бъдат отменени само