Rozdiel medzi preťažením funkcií a prepísaním v C ++

Autor: Laura McKinney
Dátum Stvorenia: 1 Apríl 2021
Dátum Aktualizácie: 11 Smieť 2024
Anonim
Rozdiel medzi preťažením funkcií a prepísaním v C ++ - Technológie
Rozdiel medzi preťažením funkcií a prepísaním v C ++ - Technológie

Obsah


V roku ‘preťažovaniu‘Redefinujeme preťažené funkcie s rovnakým názvom funkcie, ale s rôznym počtom a typom parametrov. V roku ‘prvoradý‘Prototypu prepísanej funkcie je v celom programe rovnaký, ale funkcii, ktorá sa má prepísať, predchádza kľúčové slovo„ virtuálny “v základnej triede a predefinovaná odvodená trieda bez kľúčového slova.

Polymorfizmus je jednou z hlavných čŕt OOP. Znamená to jednoducho „používanie jedného mena pre viac formulárov“. Polymorfizmus je možné implementovať pomocou „preťaženia funkcií“, „preťaženia operátora“ a „virtuálnej funkcie“. Pojem „preťaženie“ a „prekonanie“ znamená koncept polymorfizmu. „Preťaženie“ je tu polymorfizmus kompilácie času a „prevažujúci“ je polymorfizmus behom času. Ďalšie štúdium, ak hovoríme o veľkom rozdiele v „preťažení“ a „nadradenom“.


Ďalej budeme študovať rozdiel medzi preťažením a nadváhou pomocou porovnávacej tabuľky.

  1. Porovnávacia tabuľka
  2. definícia
  3. Kľúčové rozdiely
  4. podobnosti
  5. záver


Porovnávacia tabuľka:

Základ pre porovnaniepreťaženieprvoradý
prototypPrototyp sa líši v závislosti od počtu alebo typu parametra.Všetky aspekty prototypu musia byť rovnaké.
kľúčovéPočas preťaženia sa nepoužilo žiadne kľúčové slovo.Funkcii, ktorá sa má prepísať, predchádza kľúčové slovo virtual v základnej triede.
Rozlišovací faktorPočet alebo typ parametra sa líši, čo určuje verziu funkcie, ktorá sa volá.Ktorú funkciu triedy vyvoláva ukazovateľ, určuje adresa, ktorej objektu triedy je priradený tento ukazovateľ.
Definovanie vzoruFunkcia je predefinovaná s rovnakým názvom, ale s iným počtom a typom parametra.Funkcia je definovaná, ktorej predchádza kľúčové slovo virtuálne v hlavnej triede a predefinované odvodenou triedou bez kľúčového slova.
Čas splneniaZostaviť čas.Beh programu.
Konštruktor / virtuálna funkciaKonštruktory môžu byť preťažené.Virtuálnu funkciu je možné prepísať.
ničiteľ
Ničiteľ nemôže byť preťažený.Ničiteľ môže byť potlačený.
viazaniePreťažením sa dosiahne včasná väzba.Prvoradé sa týka oneskorenej väzby.


Definícia preťaženia

Polymorfizmus v čase kompilácie sa nazýva „preťaženie“. Pretože preťaženie je generované koncepciou polymorfizmu, poskytuje „spoločné rozhranie pre viac metód“. To znamená, že ak je nejaká funkcia preťažená, pri jej predefinovaní obsahuje rovnaký názov funkcie.

Preťažené funkcie sa líšia v závislosti od iného „počtu alebo typu parametrov“, vďaka čomu sa jedna preťažená funkcia líši od druhej. Týmto spôsobom kompilátor rozpozná, ktorá preťažená funkcia sa volá. Najčastejšie preťažené funkcie sú „konštruktéri“. „Kopírovanie konštruktora“ je druh „preťaženia konštruktora“.

Implementácia preťaženia v C ++

preťaženie triedy {int a, b; public: int load (int x) {// funkcia prvého načítania () a = x; vrátiť a; } funkcia int load (int x, int y) {// druhá funkcia load () a = x; b = y; návrat a * b; }}; int main () {preťaženie O1; O1.load (20); // prvé volanie funkcie load () O1.load (20,40); // druhé volanie funkcie load ()}

Tu je preťaženie funkcie load () preťaženia triedy. Obe preťažené funkcie triedy sa dajú rozlíšiť tak, že prvá funkcia load () akceptuje iba jeden celočíselný parameter, zatiaľ čo druhá funkcia load () akceptuje dva celočíselné parametre. Keď objekt preťaženia triedy vyvolá funkciu load () pomocou jediného parametra, vyvolá sa funkcia load (). Keď objekt volá funkciu load () prechádzajúcu dvoma parametrami, zavolá sa druhá funkcia load ().

Vymedzenie pojmu

Polymorfizmus dosiahnutý počas behu sa nazýva „prevažujúci“. Dosahuje sa to použitím „dedičnosti“ a „virtuálnych funkcií“. Pred prepísanou funkciou predchádza kľúčové slovo „virtuálne“ v základnej triede a predefinované v odvodenej triede bez kľúčového slova.

Jednou z najdôležitejších vecí, ktorú si treba zapamätať v prípade potlačenia je, že prototyp funkcie s prepísanou funkciou sa nesmie meniť, zatiaľ čo odvodená trieda ju znovu definuje. Keď je vyvolané prepísanie funkcie, C ++ určí, ktorá verzia funkcie sa volá, na základe typu objektu označeného ukazovateľom, ktorým sa vyvolá funkcia.

Implementácia Overriding v C ++

class base {public: virtual void funct () {// virtuálna funkcia cout základnej triedy << "Toto je funct () základných tried"; "; }}; class deriv1: public base {public: void funct () {// virtuálna funkcia základnej triedy predefinovaná v co1 odvodenej triedy1 << "Toto je derivovaná trieda funct ()"; }}; class deriv2: public base {public: void funct () {// virtuálna funkcia základnej triedy predefinovaná v co2 odvodenej triedy2 << "Toto je derivovaná trieda funct ()"; }}; int main () {base * p, b; odvodené1 dl; odvodené2d2; * P = b; p-> Funct (); // volanie funkcie funct (). * P = d1; p-> Funct (); // volanie na odvodenú triedu funct (). * P = d2; p-> Funct (); // volanie odvodenej funkcie triedy 2 (). návrat 0; }

Tu je jedna základná trieda, ktorá je verejne zdedená dvoma odvodenými triedami. Virtuálna funkcia je definovaná v základnej triede s kľúčovým slovom „virtuálna“ a predefinovaná obidvomi odvodenými triedami bez kľúčového slova. V main () základná trieda vytvára ukazovateľovú premennú „p“ a objekt „b“; 'Odvodená1' trieda vytvára objekt d1 a odvodená trieda 2 vytvára objekt d2 '.

Teraz je spočiatku adresa objektu základnej triedy „b“ priradená k ukazovateľovi základnej triedy „p“. „P“ vyvoláva funkčnú funkciu (), takže sa volá funkcia základnej triedy.Potom je adresa odvodeného objektu triedy 1 „d1“ priradená k ukazovateľovi „p“, opäť vyvolá funkciu funct (); tu sa vykoná funkcia funct () odvodenej triedy. Nakoniec sa k objektu odvodenej triedy 2 priradí ukazovateľ „p“. Potom funkcia „p“ volá funkciu funct (), ktorá vykoná funkciu funct () odvodenej triedy 2.

Ak by odvodená trieda1 / odvodená2 nefinovala funkciu funct (), potom by sa zavolala funkcia funct () základnej triedy, pretože virtuálna funkcia je „hierarchická“.

  1. Prototyp funkcie, ktorá je preťažená, sa líši v dôsledku typu a počtu parametrov, ktoré sa odovzdajú preťaženej funkcii. Na druhej strane sa prototyp prepísanej funkcie nemení, pretože prepísaná funkcia vykonáva rôzne akcie pre rôzne triedy, do ktorých patrí, ale s rovnakým typom a počtom parametrov.
  2. Preťažený názov funkcie nemá prednosť pred žiadnym kľúčovým slovom, zatiaľ čo názov funkcie s prepísanou funkciou predchádza iba kľúčovému slovu „Virtuálny“ v základnej triede.
  3. Ktorá preťažená funkcia sa vyvolá, závisí od typu alebo počtu parametrov, ktoré sa do funkcie odovzdajú. Prepísaná funkcia, ktorej trieda sa vyvolá, závisí od toho, ktorá adresa triedy tejto triedy je priradená k ukazovateľovi, ktorý túto funkciu vyvolal.
  4. Ktorá preťažená funkcia sa má vyvolať, sa vyrieši počas kompilácie. Ktorá prepísaná funkcia, ktorá sa má vyvolať, je vyriešená počas behu.
  5. Konštruktory môžu byť preťažené, ale nemôžu byť potlačené.
  6. Ničiteľ nemôže byť preťažený, ale môže byť prepísaný.
  7. Preťažením sa dosiahne skorá väzba, pretože ktorá preťažená funkcia bude vyvolaná, je vyriešená počas kompilácie. Prepísaním sa dosiahne oneskorená väzba, pretože ktorá prepísaná funkcia bude vyvolaná, je počas behu vyriešená.

podobnosti

  1. Obidve sa aplikujú na členské funkcie triedy.
  2. Polymorfizmus je základným konceptom oboch.
  3. Názov funkcie zostáva rovnaký, kým na funkcie aplikujeme preťaženie a prepísanie.

záver

Preťaženie a prekonanie sa zdá byť podobné, ale nie je tomu tak. Funkcie môžu byť preťažené, ale žiadna trieda nemôže v budúcnosti preťaženú funkciu ďalej definovať. Virtuálnu funkciu nemožno preťažiť; môžu byť potlačené.