Nadalje, proučavamo razliku između preopterećenja i nadjačavanja uz pomoć usporedne tablice.
Tablica usporedbe:
Osnova za usporedbu | preopterećenje | najvažniji |
---|---|---|
Prototip | Prototip se razlikuje ovisno o broju ili tipu parametra. | Svi aspekti prototipa moraju biti isti. |
Riječ | Tijekom preopterećenja nije primijenjena nijedna ključna riječ. | Funkciji koja se mora nadjačati prethodi ključna riječ 'virtual', u osnovnoj klasi. |
Razlikovni čimbenik | Broj ili tip parametra razlikuje se što određuje da se poziva funkcija. | Koja je funkcija klase pozvana po pokazivaču, određena je adresom, kojoj je objektu dodijeljen objekt tog pokazivača. |
Definiranje uzorka | Funkcija se redefinira s istim imenom, ali različitim brojem i tipom parametra. | Funkcija je definirana, kojoj prethodi ključna riječ 'virtual' u glavnoj klasi i redefinirana je izvedenom klasom bez ključne riječi. |
Vrijeme izvršenja | Vrijeme kompajliranja. | Vrijeme izvođenja. |
Konstruktor / virtualna funkcija | Konstruktori mogu biti preopterećeni. | Virtualna funkcija može se poništiti. |
peć za sagorijevanje otpadaka | Uništač se ne može preopteretiti. | Razarač može biti poništen. |
vezivanje | Preopterećenje postiže rano vezanje. | Prekoračenje se odnosi na kasno vezanje. |
Definicija preopterećenja
Polimorfizam vremena sastavljanja naziva se "preopterećenje". Kako se preopterećenje generira iz koncepta polimorfizma, ono pruža "zajedničko sučelje za više metoda". To znači da, ako je funkcija preopterećena, ona sadrži isto ime funkcije dok je redefinirano.
Preopterećene funkcije razlikuju se u odnosu na, različiti 'broj ili tip parametara', čini jednu preopterećenu funkciju različitom od druge. Na taj način kompajler prepoznaje koja se preopterećena funkcija zove. Najčešće preopterećene funkcije su 'konstruktori'. "Kopiraj konstruktor" je vrsta "preopterećenja konstruktora".
Implementacija preopterećenja u C ++
klasa preopterećenja {int a, b; public: int load (int x) {// prva funkcija load () a = x; return a; } int load (int x, int y) {// druga funkcija opterećenja () a = x; b = y; return a * b; }}; int main () {preopterećenje O1; O1.load (20); // prvi load () funkcija poziva O1.load (20, 40); // drugi poziv za učitavanje ()
Ovdje je funkcija load () preopterećenja klase preopterećena. Dvije preopterećene funkcije klase mogu se razlikovati na način da prva load () funkcija prihvaća samo jedan cijeli broj, dok druga load () funkcija prihvaća dva cjelobrojna parametra. Kada objekt preopterećenja klase pozove load () funkciju s jednim parametrom, pozove se prva funkcija load (). Kada objekt pozove opciju load () koja prolazi kroz dva parametra, poziva se druga funkcija load ().
Definicija poništavanja
Polimorfizam postignut tijekom vremena izvođenja naziva se "nadjačavanje". To se postiže korištenjem 'nasljeđivanja' i 'virtualnih funkcija'. Funkciji koju treba poništiti prethodi ključna riječ 'virtualna' u osnovnoj klasi i redefinira se u izvedenoj klasi bez ključne riječi.
Jedna od najvažnijih stvari koje treba zapamtiti u slučaju nadjačavanja jest da se prototip nadjačane funkcije ne smije mijenjati dok ga izvedena klasa redefinira. Kada je zadanoj funkciji dodijeljen poziv, C ++ određuje koja se verzija funkcije naziva na temelju 'tipa objekta koji je pokazivao pokazivač' pomoću kojeg je izvršeno pozivanje funkcije.
Implementacija nadjačavanja u C ++
klasa baza {public: virtual void funct () {// virtualna funkcija bazne klase cout << "Ovo je funkcija osnovne klase ()"; }}; klasa izvedena1: javna baza {javna: void funct () {// virtualna funkcija osnovne klase redefinirana u izvedenoj klasi cout << "Ovo je funkcija izvedene klase ()"; }}; izvedena klasa2: javna baza {javna: void funct () {// virtualna funkcija osnovne klase redefinirana u izvedenom razredu coutFunct (); // poziv na funkciju izvedene klase (). * P = d2; p> Funct (); // poziv na funkciju izvedene klase (). return 0; }
Ovdje postoji jedna osnovna klasa koja je javno naslijedila dvije izvedene klase. Virtualna funkcija definirana je u osnovnoj klasi s ključnom riječi "virtualna", a redefinirana je i iz izvedenih klasa bez ključne riječi. U main (), osnovna klasa kreira pokazivačku varijablu 'p' i objekt 'b'; 'izvedena' creates klasa stvara objekt d1 i izvedena2 klasa stvara objekt d2 '.
U početku, adresa objekta osnovne klase 'b' dodijeljena je pokazivaču osnovne klase 'p'. 'p' daje poziv funkciji funct (), pa se poziva funkcija osnovne klase. Tada je adresa izvedenoga objekta klase 'd1' dodijeljena pokazivaču 'p', opet daje poziv funct (); ovdje se izvršava funkcija funct () izvedene klase. Konačno, pokazivač 'p' dodijeljen je objektu izvedene klase. Zatim 'p' poziva funkciju funct () koja izvršava funkciju func () izvedene klase.
Ako izvedena klasa / reda2 nije redefinirala funct (), tada bi se pozvao funct () osnovne klase, jer su virtualne funkcije 'hijerarhijske'.
Ključne razlike između preopterećenja i poništavanja
- Prototip funkcije koja se preopterećuje razlikuje se zbog tipa i broja parametra koji se prosljeđuju funkciji preopterećenja. S druge strane, prototip funkcije nadjačavanja ne mijenja se jer se funkcija nadjačavanja izvodi za različitu klasu kojoj pripada, ali s istim tipom i brojem parametra.
- Preopterećeno ime funkcije ne prethodi nijednoj ključnoj riječi, dok naziv funkcije poništavanja prethodi ključu "Virtual" samo u osnovnoj klasi.
- Koja funkcija preopterećenja se poziva ovisi o vrsti ili broju parametra koji se prosljeđuje funkciji. Prekoračena funkcija o kojoj klasi se poziva ovisi o tome koja je objektna adresa klase dodijeljena pokazivaču, koji je pozvao funkciju.
- Koja preopterećena funkcija se treba pozvati rješava se za vrijeme kompajliranja. Koja nadjačana funkcija koju treba pozvati rješava se tijekom izvođenja.
- Konstruktori se mogu preopteretiti, ali se ne mogu poništiti.
- Destruktori ne mogu biti preopterećeni, ali se mogu poništiti.
- Preopterećenje postiže rano vezanje za koje je preopterećena funkcija pozvana riješeno za vrijeme kompajliranja. Prekoračenje postiže kasno vezanje kao što će se nadjačati funkcija pozvati rješava tijekom runtime.
sličnosti
- Oba se primjenjuju na članske funkcije klase.
- Polimorfizam je osnovni koncept koji stoji iza njih.
- Naziv funkcije ostaje isti dok primjenjujemo preopterećenje i nadjačavanje funkcija.
Zaključak
Preopterećenje i poništavanje izgleda slično, ali to nije slučaj. Funkcije mogu biti preopterećene, ali svaka klasa ne može dodatno redefinirati preopterećenu funkciju u budućnosti. Virtualna funkcija ne može biti preopterećena; mogu se samo poništiti.