Ďalej skúmame rozdiel medzi preťažením a preťažením pomocou porovnávacej tabuľky.
Porovnávacia tabuľka:
Základ pre porovnanie | preťaženie | prvoradý |
---|---|---|
prototyp | Prototyp sa líši, pretože počet alebo typ parametra sa môže líšiť. | Všetok aspekt prototypu musí byť rovnaký. |
kľúčové | Pri preťažení sa nepoužíva žiadne kľúčové slovo. | Funkcii, ktorá má byť prepísaná, predchádza kľúčové slovo "virtuálne" v základnej triede. |
Rozlišujúci faktor | Počet alebo typ parametra sa líši, čo určuje verziu funkcie sa volá. | Ktorá funkcia triedy sa nazýva ukazovateľ, určuje adresa, ktorému objektu triedy je priradený danému ukazovateľu. |
Definovanie vzoru | Funkcie sú predefinované rovnakým názvom, ale rôznym číslom a typom parametra. | Definuje sa funkcia, pred ktorou je kľúčové slovo "virtuálne" v hlavnej triede a predefinované odvodenou triedou bez kľúčového slova. |
Čas splnenia | Čas kompilácie. | Čas spustenia. |
Konštruktor / Virtuálna funkcia | Konštruktory môžu byť preťažené. | Virtuálna funkcia môže byť zrušená. |
ničiteľ | Destruktor nie je možné preťažiť. | Destruktor môže byť prepísaný. |
viazanie | Preťaženie dosahuje skorú väzbu. | Prepísanie znamená neskorú väzbu. |
Definícia preťaženia
Polymorfizmus kompilácie sa nazýva "preťaženie". Preťaženie sa vytvára z konceptu polymorfizmu a poskytuje "spoločné rozhranie pre viaceré metódy". To znamená, že ak je funkcia preťažená, obsahuje rovnaký názov funkcie, kým je predefinovaná.
Preťažené funkcie sa líšia v závislosti od "počtu alebo typu parametrov", spôsobuje, že jedna preťažená funkcia je odlišná od druhej. Týmto spôsobom kompilátor rozpozná, ktorá funkcia preťaženia sa volá. Najčastejšie preťažené funkcie sú "konštruktory". "Kopírovací konštruktor" je druh "preťaženia konštruktéra".
Implementácia preťaženia v C ++
preťaženie triedy {int a, b; verejné: int zaťaženie (int x) {// prvé zaťaženie () funkcia a = x; vrátiť a; } int záťaž (int x, int y) {// druhá záťaž () funkcia a = x; b = y; vrátiť a * b; }}; int main () {preťaženie O1; O1.load (20); // prvé zaťaženie () volanie funkcie O1.load (20, 40); // volanie funkcie druhého načítania ()}
Tu sa zaťaženie funkcie () preťaženia triedy preťažilo. Dve preťažené funkcie triedy sa dajú rozlíšiť tak, že funkcia prvého zaťaženia () prijíma iba jediný celočíselný parameter, zatiaľ čo druhá funkcia load () akceptuje dva celočíselné parametre. Keď objekt preťaženia triedy volá funkciu load () s jedným parametrom, zavolá sa prvé zaťaženie (). Keď objekt volá load () funkcia prechádzajúce dva parametre, druhá load () funkcia sa volá.
Definícia prevažujúceho
Polymorfizmus dosiahnutý počas spustenia sa nazýva "prevratný". Vykonáva sa pomocou "dedičnosti" a "virtuálnych funkcií". Funkcii, ktorá sa má prepísať, predchádza kľúčové slovo "virtuálne" v základnej triede a predefinované v odvodenej triede bez kľúčového slova.
Jedna z najdôležitejších vecí, ktorú si treba pamätať v prípade prevratu je, že prototyp premenenej funkcie sa nesmie meniť, zatiaľ čo odvodená trieda ju predefinuje. Keď je prepojená funkcia daná, C ++ určuje, ktorá verzia funkcie sa volá na základe typu objektu označeného ukazovateľom, ktorým sa volá funkcia.
Implementácia prepúšťania v jazyku C ++
class public {public: virtual void funct () {// virtuálna funkcia základnej triedy cout << "Toto je funkcia základnej triedy ()"; }}; trieda odvodená1: verejná základňa {public: void funct () {// virtuálna funkcia základnej triedy predefinovaná v odvodenej triede cout << "Toto je funkcia odvodenej triedy1"; }}; class odvodené2: verejná základňa {public: void funct () {// virtuálna funkcia základnej triedy predefinovaná v odvodenej triede coutFunct (); // volanie k odvodenej triede funct (). * P = d2; p-> Funct (); // volanie do odvodenej triedy funct (). návrat 0; }
Tu existuje 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álny" a je definovaná oboma odvodenými triedami bez kľúčového slova. V hlavnej () základná trieda vytvára ukazovateľ premennej "p" a objekt "b"; Trieda 'derived1' vytvorí objekt d1 a odvodená trieda vytvorí objekt d2 '.
Teraz sa pôvodne adresa objektu základnej triedy "b" priradí ukazovateľu základnej triedy "p". 'p' volá funkciu funct (), tak sa nazýva funkcia základnej triedy. Potom adresa odvodeného objektu triedy 'd1' je priradená ukazovateľu 'p', znova vyvolá funkciu (); tu je vykonaná funkcia funct () triedy odvodené1. Nakoniec je ukazovateľ 'p' priradený k objektu triedy derived2. Potom funkcia 'p' volá funct (), ktorá vykonáva funkciu func () triedy odvodené.
Ak trieda odvodená1 / odvodená2 nereadefinovala funkciu (), potom by sa nazývala funct () základnej triedy, pretože virtuálna funkcia je "hierarchická".
Kľúčové rozdiely medzi preťažením a preradením
- Prototyp funkcie, ktorá je preťažená, sa líši v závislosti od typu a počtu parametrov, ktoré prechádzajú na preťaženú funkciu. Na druhej strane sa prototyp premenenej funkcie nemení, pretože premenená funkcia vykonáva odlišnú akciu pre odlišnú triedu, do ktorej patrí, ale má rovnaký typ a počet parametrov.
- Názov preťaženej funkcie nepredchádza s akýmkoľvek kľúčovým slovom, zatiaľ čo názov premenenej funkcie predchádza iba klávesovou skratkou "Virtuálna" v základnej triede.
- Ktorá funkcia preťaženia je vyvolaná, závisí od typu alebo počtu parametrov, ktoré boli prenesené do funkcie. Prepísaná funkcia ktorej triedy je vyvolaná závisí od toho, ktorá adresa objektu triedy je priradená ukazovateľu, ktorý vyvolal funkciu.
- Ktorá funkcia preťaženia má byť vyvolaná, je vyriešená počas kompilácie. Ktorá nadradená funkcia, ktorá má byť vyvolaná, sa vyrieši počas behu.
- Konštruktory môžu byť preťažené, ale nemôžu byť prekonané.
- Distruktory nemôžu byť preťažené, ale môžu byť prekonané.
- Preťaženie dosahuje včasnú väzbu, pri ktorej sa vyvolá preťažená funkcia, vyriešená počas kompilácie. Preradenie dosahuje neskorú väzbu, pretože prepočítaná funkcia sa vyvolá počas spustenia.
podobnosti
- Obe sa vzťahujú na funkcie členov triedy.
- Polymorfizmus je základným konceptom obidvoch.
- Názov funkcie zostáva rovnaký, keď aplikujeme preťaženie a preradenie funkcií.
záver
Preťaženie a preťaženie sa zdá podobné, ale nie je to tak. Funkcie môžu byť preťažené, ale žiadna trieda už nemôže ďalej definovať preťaženú funkciu v budúcnosti. Virtuálna funkcia nemôže byť preťažená; môžu byť prepisované iba.