Diferența dintre supraîncărcarea funcției și supraîncărcarea în C ++

Autor: Laura McKinney
Data Creației: 1 Aprilie 2021
Data Actualizării: 11 Mai 2024
Anonim
Diferența dintre supraîncărcarea funcției și supraîncărcarea în C ++ - Tehnologie
Diferența dintre supraîncărcarea funcției și supraîncărcarea în C ++ - Tehnologie

Conţinut


În „Supraîncărcarea„Redefinim funcțiile supraîncărcate cu același nume de funcție, dar, număr și tip de parametri diferiți. În „imperative„Prototipul funcției suprasolicitate este același pe parcursul programului, dar funcția care trebuie depășită este precedată de cuvântul cheie„ virtual ”din clasa de bază și este redefinită de clasa derivată fără niciun cuvânt cheie.

Polimorfismul este una dintre caracteristicile cruciale ale OOP. Înseamnă pur și simplu „folosirea unui nume pentru mai multe forme”. Polimorfismul poate fi implementat folosind „supraîncărcare de funcții”, „supraîncărcare operator” și „funcție virtuală”. Ambele, „supraîncărcare” și „suprapunere” implică conceptul de polimorfism. Aici, „supraîncărcarea” este compilați polimorfismul timpului, iar „suprasolicitarea” este polimorfismul în timp. Studierea în continuare, dacă vorbim despre diferența majoră în „supraîncărcare” și „supraîncărcare”.


În plus, studiem diferența dintre supraîncărcare și suprasolicitare cu ajutorul unui grafic de comparație.

  1. Diagramă de comparație
  2. Definiție
  3. Diferențele cheie
  4. Asemănările
  5. Concluzie


Diagramă de comparație:

Baza pentru comparațiesupraîncărcareaSupracomandarea
PrototipPrototipul diferă, deoarece numărul sau tipul parametrului pot diferi.Toate aspectele prototipului trebuie să fie aceleași.
cuvinte cheieNu a fost aplicat niciun cuvânt cheie în timpul supraîncărcării.Funcția care trebuie anulată este precedată de cuvântul cheie virtual, din clasa de bază.
Factorul distinctivNumărul sau tipul de parametru diferă, ceea ce determină versiunea funcției.Ce funcție de clase este apelată de indicatorul, este determinată de, adresa cărei obiecte de clase sunt atribuite acelui pointer.
Definirea modeluluiFuncțiile sunt redefinite cu același nume, dar diferite număr și tip de parametru.Funcția este definită, precedată de un cuvânt cheie virtual din clasa principală și redefinită de clasa derivată cu cuvântul cheie afară.
Timp de realizareCompilați timpul.Timpul de rulare.
Funcția constructor / virtualConstructorii pot fi supraîncărcați.Funcția virtuală poate fi anulată.
distrugător
Distrugătorul nu poate fi supraîncărcat.Distrugătorul poate fi anulat.
LegareSupraîncărcarea realizează legarea timpurie.Suprasolicitarea se referă la legarea tardivă.


Definiția Overloading

Polimorfismul în timp compilator se numește „supraîncărcare” Întrucât supraîncărcarea este generată dintr-un concept de polimorfism, oferă „o interfață comună pentru mai multe metode”. Asta înseamnă că, dacă o funcție este supraîncărcată, ea conține același nume de funcție în timp ce este redefinită.

Funcțiile supraîncărcate diferă în ceea ce privește, „număr sau tip de parametru (parametri) diferiți”, face ca o funcție supraîncărcată să difere de alta. În acest fel, compilatorul recunoaște ce funcție supraîncărcată este apelată. Cele mai des supraîncărcate funcții sunt „constructori”. „Copie constructor” este un fel de „supraîncărcare a constructorului”.

Implementarea supraîncărcării în C ++

suprasarcină de clasă {int a, b; public: int load (int x) {// prima sarcină () funcție a = x; returna a; } int load (int x, int y) {// a doua sarcină () funcție a = x; b = y; a returna a * b; }}; int main () {supraîncărcare O1; O1.load (20); // prima funcție de încărcare () apelare O1.load (20,40); // apelul funcției de încărcare secundă ()}

Aici s-a supraîncărcat sarcina () a supraîncărcării clasei. Cele două funcții supraîncărcate ale clasei pot fi distinse într-o manieră în care prima funcție load () acceptă doar un singur parametru întreg, în timp ce a doua funcție load () acceptă doi parametri întregi. Când obiectul supraîncărcării de clasă apelează funcția load () cu un singur parametru, se apelează prima funcție load (). Când obiectul apelează funcția load () care trece doi parametri, a doua funcție load () este apelată.

Definiția Overriding

Polimorfismul obținut în timpul perioadei de rulare se numește „imperativ”. Se realizează folosind „moștenire” și „funcții virtuale”. Funcția care trebuie depășită este precedată de cuvântul cheie „virtual” dintr-o clasă de bază și redefinită într-o clasă derivată fără niciun cuvânt cheie.

Unul dintre cele mai importante lucruri de reținut în caz de suprasolicitare este faptul că prototipul funcției suprasolicitate nu trebuie să se schimbe în timp ce clasa derivată o redefinește. Când se apelează la o funcție suprasolicitată, C ++ stabilește ce versiune a funcției este numită pe baza „tipului obiectului indicat de un indicator” prin care se efectuează apelarea funcției.

Punerea în aplicare a Suprascrierii în C ++

class base {public: virtual void function () {// funcția virtuală a clasei de bază cout << "Aceasta este o funcție de clasă de bază ()"; }}; class deriv1: public base {public: void function () {// funcția virtuală a clasei de bază redefinite în derivate1 class cout << "Aceasta este o funcție derivată din clase1 ()"; }}; class derivat2: public base {public: void function () {// funcția virtuală a clasei de bază redefinită în derivate2 class cout << "Aceasta este o funcție derivată din clase2 ()"; }}; int main () {bază * p, b; derivat1 d1; derivat2 d2; * P = & b; p-> funct (); // apel la funcția clasei de bază (). * P = & d1; p-> funct (); // apel la funcția derivată1 (). * P = & d2; p-> funct (); // apel la funcția derivată2 (). returnare 0; }

Aici, există o singură clasă de bază care este moștenită public de două clase derivate. O funcție virtuală este definită într-o clasă de bază cu un cuvânt cheie „virtual” și este redefinită de ambele clase derivate fără niciun cuvânt cheie. În principal (), clasa de bază creează o variabilă pointer „p” și un obiect „b”; Clasa „derivat1” creează un obiect d1 și clasa derivată creează un obiect d2 ”.

Acum, inițial, adresa obiectului clasei de bază „b” este atribuită indicatorului clasei de bază „p”. „P” apelează funcția funcție (), astfel încât o funcție a clasei de bază este apelată.Apoi adresa obiectului clasei derivate „d1” este atribuită indicatorului „p”, iarăși dă apel la funcție (); aici funcția funcție () a clasei derivate este executată. În cele din urmă, indicatorul „p” este atribuit obiectului clasei derivate2. Apoi „p” apelează funcția funcție () care execută funcția funcție () din clasa derivată2.

Dacă clasa derivată / derivată2 nu redefini funcția (), atunci funcția () clasei de bază ar fi fost apelată, deoarece funcția virtuală este „ierarhică”.

  1. Prototipul unei funcții care este supraîncărcat diferă din cauza tipului și numărului parametrului care sunt transmise funcției supraîncărcate. Pe de altă parte, prototipul funcției suprasolicitate nu se schimbă, deoarece o funcție suprasolicitată realizează acțiuni diferite pentru clasa diferită din care face parte, dar cu același tip și număr de parametru.
  2. Numele funcției supraîncărcate nu precede niciun cuvânt cheie, întrucât, numele unei funcții suprasolicitate precedă cu cheia „Virtuală” doar în clasa de bază.
  3. Care funcție supraîncărcată este invocată depinde de tipul sau numărul de parametri care este trecut la funcție. Funcția înlocuită a cărei clasă este invocată depinde de care adresă obiect a clasei este atribuită indicatorului, care a invocat funcția.
  4. Ce funcție supraîncărcată care trebuie invocată este rezolvată în timpul compilării. Ce funcție suprasolicitată care trebuie invocată este rezolvată în timpul rulării.
  5. Constructorii pot fi supraîncărcați, dar nu pot fi ignorați.
  6. Distrugătorii nu pot fi supraîncărcați, dar pot fi suprasolicitați.
  7. Supraîncărcarea realizează legarea timpurie, deoarece funcția supraîncărcată care va fi invocată este rezolvată în timpul compilării. Suprasolicitarea realizează legarea tardivă, deoarece funcția suprasolicitată va fi invocată este rezolvată în timpul perioadei de execuție.

Asemănările

  1. Ambele sunt aplicate funcțiilor de membru ale unei clase.
  2. Polimorfismul este conceptul de bază din spatele ambelor.
  3. Numele funcției rămâne același în timp ce aplicăm supraîncărcarea și suprasolicitarea funcțiilor.

Concluzie

Supraîncărcarea și prescurtarea pare similară, dar nu este cazul. Funcțiile pot fi supraîncărcate, însă, orice clasă nu poate redefini în continuare funcția supraîncărcată în viitor. O funcție virtuală nu poate fi supraîncărcată; ele nu pot fi depășite decât.