Recomandat, 2024

Alegerea Editorului

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

Polimorfismul este una din trăsăturile cruciale ale POR. Pur și simplu înseamnă "folosirea unui nume pentru forme multiple". Polimorfismul poate fi implementat folosind "supraîncărcarea funcției", "supraîncărcarea operatorului" și "funcția virtuală". Atât "supraîncărcarea", cât și "depășirea" implică conceptul de polimorfism. Aici, "supraîncărcarea" este polimorfismul compilării timpului, iar "depășirea" este polimorfismul timpului de execuție. Studiind mai departe, dacă vorbim despre diferența majoră în "supraîncărcare" și "depășire". În "supraîncărcare" redefinim funcțiile supraîncărcate cu același nume de funcție, dar cu un număr diferit și un tip diferit de parametri. În prototipul "overriding" al funcției suprasolicitate este aceeași pe tot parcursul programului, dar funcția care trebuie suprimată este precedată de cuvântul cheie "virtual" din clasa de bază și este redefinită de clasa derivată fără nici un cuvânt cheie.

Mai mult, studiem diferența dintre supraîncărcare și depășire cu ajutorul unei scheme de comparație.


Diagramă de comparație:

Bazele comparațieisupraîncărcareaSupracomandarea
PrototipPrototipul diferă deoarece numărul sau tipul parametrului poate diferi.Toate aspectele prototipului trebuie să fie identice.
cuvinte cheieNu a fost folosit niciun cuvânt cheie în timpul supraîncărcării.Funcția care trebuie suprimată este precedată de cuvântul cheie "virtual", din clasa de bază.
Factor de distincțieNumărul sau tipul parametrului diferă, ceea ce determină numirea versiunii funcției.Funcția clasei pe care o numește pointerul este determinată de adresa cărui obiect al clasei i se atribuie acel indicator.
Definirea modeluluiFuncțiile sunt redefinite cu același nume, dar cu un număr diferit și un tip diferit de parametru.Funcția este definită, precedată de un cuvânt cheie "virtual" în clasa principală și redefinită de clasa derivată fără cuvânt cheie.
Ora de realizareTimp de compilare.Rulați timpul.
Constructor / funcție virtualăConstructorii pot fi supraîncărcați.Funcția virtuală poate fi înlocuită.
distrugător
Distrugătorul nu poate fi supraîncărcat.Destructorul poate fi suprasolicitat.
LegareSupraîncărcarea realizează legarea rapidă.Omiterea se referă la legarea târzie.

Definiția overloading

Polimorfismul de compilare se numește "supraîncărcare". Deoarece supraîncărcarea este generată de un concept de polimorfism, acesta oferă "o interfață comună pentru mai multe metode". Aceasta înseamnă că, dacă o funcție este supraîncărcată, aceasta 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ărul sau tipul parametrului (lor) diferit", face ca o funcție de supraîncărcare să fie distinctă de alta. În acest fel, compilatorul recunoaște ce funcție de supraîncărcare este apelată. Cele mai des întâlnite funcții sunt "constructori". "Constructorul de copiere" este un fel de "supraîncărcare a constructorului".

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

 suprasarcină de tip {int a, b; public: int sarcină (int x) {// funcția first load () a = x; returnați un; } int sarcină (int x, int y) {// funcția a doua sarcină () a = x; b = y; returnați a * b; }}; int main () {suprasarcină O1; O1.load (20); // prima încărcare () funcția apel O1.load (20, 40); // a doua încărcare () apelarea funcției} 

Aici sarcina funcției () a suprasarcinii de clasă a fost supraîncărcată. Cele două funcții supraîncărcate ale clasei pot fi distinse într-o manieră în care funcția first load () acceptă doar un singur parametru întreg, în timp ce a doua funcție load () acceptă doi parametri întregi. Atunci când obiectul suprasarcinii de clasă apelează funcția load () cu un singur parametru, se va apela funcția first load (). Atunci când obiectul invocă sarcina () funcția care transmite doi parametri, funcția second load () devine apelată.

Definiția Overriding

Polimorfismul obținut în timpul run-time este numit "imperativ". Se realizează prin utilizarea "moștenirii" și a "funcțiilor virtuale". Funcția care trebuie suprimată este precedată de cuvântul cheie "virtual" dintr-o clasă de bază și redefinită într-o clasă derivată fără nici un cuvânt cheie.

Unul dintre lucrurile cele mai importante pe care trebuie să le reamintim în caz de imperativ este acela că prototipul funcției depășite nu trebuie să se schimbe în timp ce clasa derivată o redefinește. Atunci când funcția suprascrisă primește un apel, C ++ determină ce versiune a funcției este apelată pe baza "tipului obiectului indicat de un pointer" prin care se efectuează apelarea funcției.

Implementarea suprascrierii în C ++

 clasa de bază {public: virtual void funct () {// funcția virtuală a clasei de bază cout << "Aceasta este o clasă de bază funct ()"; }}; class derived1: public base {public: void funct () {// funcția virtuală a clasei de bază redefinită în class1 derivată cout << "Aceasta este o funcție funcțională a lui derived1"; }}; class derived2: public base {public: void funct () {// funcția virtuală a clasei de bază redefinită în derivate class cout  funct (); // apelați la funcția derivat class1 (). * P = & d2; p-> funct (); // apelați la funcția derived2 din clasa derived. retur 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ă atât de clasele derivate fără cuvânt cheie. În clasa principală (), clasa de bază creează o variabilă a pointerului "p" și un obiect "b"; Clasa "derived1" creează un obiect d1, iar clasa derived2 creează un obiect d2 '.

Acum, inițial adresa obiectului clasei de bază "b" este atribuită indicatorului clasei de bază "p". 'p' dă un apel funcției funct (), deci se numește o funcție a clasei de bază. Apoi, adresa obiectului class1 derivat "d1" este atribuită pointerului "p", din nou dă call la funct (); aici este executată funcția funct () a clasei derivate1. În cele din urmă, pointerul "p" este atribuit obiectului din clasa derived2. Apoi apelul "p" funcționează funcct () care execută funcția func () din clasa deriv2.

Dacă clasa derived1 / derived2 nu a redefinit funcct (), atunci funcția () a clasei de bază ar fi fost numită, deoarece funcția virtuală este "ierarhică".

Diferențele cheie între supraîncărcare și depășire

  1. Prototipul unei funcții care este suprasolicitat diferă datorită tipului și numărului de parametri care sunt transmise funcției supraîncărcate. Pe de altă parte, prototipul funcției depășite nu se modifică deoarece o funcție suprascrisă efectuează o acțiune diferită pentru clasa diferită de care aparține, dar cu același tip și număr de parametru.
  2. Numele funcției supraîncărcate nu precede niciun cuvânt cheie, în timp ce numele unei funcții înlocuite precede cu tasta "Virtual" numai în clasa de bază.
  3. Funcția de supraîncărcare care este invocată depinde de tipul sau numărul parametrului care este transmis funcției. Funcția suprascrisă a clasei invocate depinde de adresa obiectului de clasă atribuită indicatorului care a invocat funcția.
  4. Funcția de supraîncărcare ce trebuie invocată este rezolvată în timpul procesului de compilare. Funcția suprascrisă ce trebuie invocată este rezolvată în timpul execuției.
  5. Constructorii pot fi supraîncărcați, dar nu pot fi înlocuiți.
  6. Distrugătorii nu pot fi supraîncărcați, dar pot fi înlocuiți.
  7. Supraîncărcarea realizează legarea timpurie pe măsură ce funcția de suprasarcină va fi invocată este rezolvată în timpul procesului de compilare. Îndepărtarea realizează legarea târzie, deoarece funcția suprascrisă care va fi invocată este rezolvată în timpul execuției.

Asemănările

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

Concluzie

Suprasolicitarea și suprascrierea apar asemănător, dar acest lucru nu este cazul. Funcțiile pot fi supraîncărcate, însă orice clasă nu poate redefini funcția supraîncărcată în viitor. Funcția virtuală nu poate fi supraîncărcată; acestea pot fi doar suprasolicitate.

Top