Desuden studerer vi forskellen mellem overbelastning og overordnet brug ved hjælp af et sammenligningsdiagram.
Sammenligningstabel:
Grundlag for sammenligning | overbelastning | Overstyring |
---|---|---|
Prototype | Prototype er forskellig, da antallet eller typen af parameter kan variere. | Alt aspekt af prototype skal være det samme. |
Søgeord | Intet søgeord anvendt under overbelastning. | Funktion, som skal overskrides, er forud for søgeordet "virtuel", i basisklassen. |
Distinguishing faktor | Nummer eller type af parameter adskiller sig, hvilket bestemmer, hvilken version af funktionen bliver kaldt. | Hvilken klasses funktion kaldes af markøren, bestemmes af, adressen til hvilken klasses objekt er tildelt til pointeren. |
Definerer mønster | Funktionen er omdefineret med samme navn, men forskellige nummer og type af parameter. | Funktionen er defineret, forfulgt af et søgeord 'virtuelt' i hovedklassen og omdefineret af afledt klasse uden søgeord. |
Tid for opfyldelse | Kompilere tid. | Kør tid. |
Konstruktør / Virtual funktion | Konstruktører kan overbelastes. | Virtual funktion kan overstyres. |
Destructor | Destructor kan ikke overbelastes. | Destructor kan overskrides. |
Binding | Overbelastning opnår tidlig binding. | Overordnet refererer til sen binding. |
Definition af overbelastning
Kompileringstidspolymorfisme kaldes 'overbelastning'. Da overbelastning genereres ud fra et koncept af polymorfisme, giver det "en fælles grænseflade til flere metoder". Det betyder, at hvis en funktion er overbelastet, indeholder den samme funktionsnavn, mens det er omdefineret.
Overbelastede funktioner adskiller sig i forhold til, forskellige "antal eller type af parameter (er)", det gør en overbelastet funktion adskilt fra en anden. På denne måde genkender kompilatoren hvilken overbelastet funktion der kaldes. Mest overbelastede funktioner er 'konstruktører'. 'Copy constructor' er en slags "konstruktør overbelastning".
Implementering af overbelastning i C ++
klasse overbelastning {int a, b; offentligt: int load (int x) {// first load () funktion a = x; returnere a; } int load (int x, int y) {// anden belastning () funktion a = x; b = y; returnere a * b; }}; int main () {overload O1; O1.load (20); // første belastning () funktionsopkald O1.load (20, 40); // anden belastning () funktionsopkald}
Her er funktionen belastning () af klasse overbelastning overbelastet. Klassens to overbelastede funktioner kan skelnes på en måde, at den første belastning () -funktion kun accepterer en enkelt heltalsparameter, mens den anden belastning () -funktion accepterer to heltalsparametre. Når objektet i klasseoverbelastningen kalder load () -funktionen med en enkelt parameter, hentes førstlast () -funktionen. Når objektopkald last () -funktion passerer to parametre, kaldes anden belastning () -funktion.
Definition af overstyring
Polymorfisme opnået i løbetid kaldes 'tvingende'. Det opnås ved at bruge 'arv' og 'virtuelle funktioner'. Funktion, der skal tilsidesættes, foregår af søgeordet "virtuelt" i en basisklasse og omdefineres i en afledt klasse uden søgeord.
En af de vigtigste ting at huske i tilfælde af overordnet er, at prototypen for overstyrt funktionen ikke må ændres, mens afledt klasse omdefinerer den. Når overstyret funktion gives et opkald, afgør C ++ hvilken version af funktionen der kaldes baseret på 'type af objektet peget af en peger', hvormed funktionen kaldes er udført.
Implementering af overstyring i C ++
klassebase {public: virtual void funct () {// virtuelle funktion af base klasse cout << "Dette er en base klasse funct ()"; }}; klasse derived1: public base {public: void funct () {// virtuelle funktion af base klasse omdefineret i derived1 class cout << "Dette er en derived1 class funktion ()"; }}; klasse derived2: offentlig base {public: void funct () {// virtuelle funktion af base klasse omdefineret i derived2 class coutfunct (); // kald til afledt1 klasse funct (). * P = & d2; p-> funct (); // kald til derived2 class funct (). returnere 0; }
Her er der en enkelt base klasse, som er offentligt arvet af to afledte klasser. En virtuel funktion defineres i en basisklasse med et søgeord 'virtuel', og det omdefineres af både de afledte klasser uden søgeord. I hovedklasse (), skaber basisklasse en pegervariabel 'p' og et objekt 'b'; klasse 'derived1' opretter et objekt d1 og derived2 klasse opretter et objekt d2 '.
I første omgang er adressen til basisklassens objekt 'b' tildelt pegeren til basisklassen 'p'. 'p' giver et opkald til funktionsfunktionen (), så en funktion af basisklassen hedder. Derefter bliver adressen til afledt1 klasseobjekt 'd1' tildelt pegeren 'p', igen giver den opkald til funct (); Her udføres funktionsfunktionen () af derived1-klassen. Endelig er pointer 'p' tildelt afledt2-klassens objekt. Derefter kaldes 'p' funktionsfunktion (), som udfører funktions func () af derived2-klassen.
Hvis afledt1 / derived2-klassen ikke omdefinerede funct (), så ville funct () i basisklassen være blevet kaldt, da virtuel funktion er 'hierarkisk'.
Nøgleforskelle mellem overbelastning og overstyring
- Prototypen af en funktion, der overbelastes, adskiller sig på grund af typen og antallet af parametre, der sendes til den overbelastede funktion. På den anden side ændres prototypen af overstyrtfunktionen ikke, fordi en overstyret funktion udfører forskellige handlinger for den anden klasse, den tilhører, men med samme type og antal parametre.
- Det overbelastede funktionsnavn går ikke forud for et nøgleord, mens navnet på en overskridet funktion foregår kun med nøgleordet "Virtual" i basisklasse.
- Hvilken overbelastet funktion der påberåbes afhænger af typen eller antallet af parametre, der sendes til funktionen. Den overstyrede funktion, som klassen påberåber afhænger af, hvilken klasses objektadresse der er tildelt markøren, som påkalder funktionen.
- Hvilken overbelastet funktion der skal påberåbes, er løst under kompileringstidspunktet. Hvilken overstyret funktion der skal påberåbes, er løst under runtime.
- Konstruktører kan overbelastes, men kan ikke overskrides.
- Destruktorer kan ikke overbelastes, men de kan overstyres.
- Overbelastning opnår tidlig binding, som hvilken overbelastet funktion der vil blive påkaldt, er løst under kompileringstiden. Overordnet opnår sen binding, da den overstyrede funktion vil påberåbes, er løst under runtime.
ligheder
- Begge anvendes til medlemsfunktioner i en klasse.
- Polymorfisme er det grundlæggende koncept bag dem begge.
- Funktionsnavn forbliver det samme, mens vi overbelaster og overstyrer funktionerne.
Konklusion
Overbelastning og overstyring ligner hinanden, men det er ikke tilfældet. Funktioner kan overbelastes, men enhver klasse kan ikke mere omdefinere den overbelastede funktion i fremtiden. En virtuel funktion kan ikke overbelastes; de kan kun tilsidesættes.