Odporúčaná, 2024

Redakcia Choice

Rozdiel medzi preťažením funkcie a preradením v C ++

Polymorfizmus je jedným z kľúčových prvkov OOP. To jednoducho znamená "používať jeden názov pre viaceré formy". Polymorfizmus sa môže realizovať pomocou funkcie "preťaženie funkcie", "preťaženie operátora" a "virtuálna funkcia". Obe "preťaženie" a "prepúšťanie" znamenajú koncept polymorfizmu. Tu je "preťaženie" kompilácia časového polymorfizmu a "prepúšťanie" je polymorfizmus behu času. Ďalej skúmame, ak hovoríme o veľkých rozdieloch medzi "preťažením" a "prevažujúcim". Pri "preťažení" predefinujeme preťažené funkcie s rovnakým názvom funkcie, ale odlišným počtom a typom parametrov. V "prevratnom" prototype premenenej funkcie je rovnaký v celom programe, ale funkcii, ktorej sa má prepísať, predchádza kľúčové slovo "virtuálne" v základnej triede a je predefinované odvodenou triedou bez akéhokoľvek kľúčového slova.

Ď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 porovnaniepreťaženieprvoradý
prototypPrototyp 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 faktorPoč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 vzoruFunkcie 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 funkciaKonš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ý.
viazaniePreť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 cout  Funct (); // 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Konštruktory môžu byť preťažené, ale nemôžu byť prekonané.
  6. Distruktory nemôžu byť preťažené, ale môžu byť prekonané.
  7. 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

  1. Obe sa vzťahujú na funkcie členov triedy.
  2. Polymorfizmus je základným konceptom obidvoch.
  3. 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.

Top