Forskel mellem funktionsoverbelastning og overstyring i C ++

Forfatter: Laura McKinney
Oprettelsesdato: 1 April 2021
Opdateringsdato: 11 Kan 2024
Anonim
Suspense: Mister Markham, Antique Dealer / The ABC Murders / Sorry, Wrong Number - East Coast
Video.: Suspense: Mister Markham, Antique Dealer / The ABC Murders / Sorry, Wrong Number - East Coast

Indhold


I 'overbelastning‘Vi omdefinerer de overbelastede funktioner med det samme funktionsnavn, men med forskellige parametre og type. I 'tvingende'Prototype af overstyret funktion er den samme i hele programmet, men funktionen, der skal tilsidesættes, er forud for nøgleordet' virtuel 'i baseklassen og omdefineres af den afledte klasse uden noget nøgleord.

Polymorfisme er et af de afgørende træk ved OOP. Det betyder simpelthen "at bruge et navn til flere formularer". Polymorfisme kan implementeres ved hjælp af 'funktionsoverbelastning', 'operatøroverbelastning' og 'virtuel funktion'. Både 'overbelastning' og 'tilsidesættelse' indebærer begrebet polymorfisme. Her er 'overbelastning' kompilering af tidspolymorfisme, og 'tilsidesættelse' er kørselstidspolymorfisme. At studere videre, hvis vi taler om den største forskel i 'overbelastning' og 'tilsidesættelse'.


Desuden studerer vi forskellen mellem overbelastning og tilsidesættelse ved hjælp af et sammenligningskort.

  1. Sammenligningstabel
  2. Definition
  3. Vigtige forskelle
  4. ligheder
  5. Konklusion


Sammenligningstabel:

Grundlag for sammenligningoverbelastningOverstyring
PrototypePrototypen adskiller sig, da antallet eller typen af ​​parametre kan variere.Alle aspekter af prototypen skal være den samme.
SøgeordDer blev ikke anvendt noget nøgleord under overbelastning.Forud for en funktion, der skal tilsidesættes, foregår med virtuelt nøgleord i basisklassen.
Skelnen faktorAntallet eller typen af ​​parametre er forskellige, der bestemmer, hvilken version af funktionen der kaldes til.Hvilken klassefunktion, der kaldes af markøren, bestemmes af, adresse på, hvilken klasseobjekt der er tildelt markøren.
Definition af mønsterFunktion omdefineres med samme navn, men forskellige antal og parametertype.Funktion er defineret, efterfulgt af et virtuelt nøgleord i hovedklasse og omdefineret af afledt klasse med ud nøgleord.
Tid for gennemførelseKompilér tid.Kørselstid.
Konstruktør / virtuel funktionKonstruktører kan overbelastes.Virtuel funktion kan tilsidesættes.
Destructor
Destruktoren kan ikke overbelastes.Destructor kan tilsidesættes.
BindingOverbelastning opnår tidlig binding.Overstyring henviser til sen binding.


Definition af overbelastning

Kompileringstid-polymorfisme kaldes 'overbelastning.' Da overbelastning genereres fra et begreb om polymorfisme, giver det "en fælles grænseflade for flere metoder". Det betyder, at hvis en funktion er overbelastet, indeholder den samme funktionsnavn, mens den omdefineres.

Overbelastede funktioner er forskellige med hensyn til, forskellige 'antal eller type parameter (r), det gør en overbelastet funktion forskellig fra en anden. På denne måde genkender compileren hvilken overbelastet funktion der kaldes. De mest almindeligt overbelastede funktioner er 'konstruktører'. ‘Copy constructor’ er en slags ”overbelastning af konstruktører”.

Implementering af overbelastning i C ++

klasse overbelastning {int a, b; public: int load (int x) {// first load () funktion a = x; returnere a; } int belastning (int x, int y) {// anden belastning () funktion a = x; b = y; returner a * b; }}; int main () {overbelastning O1; O1.load (20); // første belastning () -funktion, kald O1.load (20,40); // second load () -funktionskald}

Her er funktionsbelastning () af klasseoverbelastning overbelastet. De to overbelastede funktioner i klassen kan skelnes på en sådan måde, at den første belastning () -funktion kun accepterer en enkelt heltal-parameter, mens den anden belastning () -funktion accepterer to heltalparametere. Når objektet for klassens overbelastning kalder funktionen load () med en enkelt parameter, kaldes den første load () -funktion. Når objektopkald belastning () -funktion, der passerer to parametre, kaldes anden belastning () -funktion.

Definition af tilsidesættelse

Polymorfisme opnået under kørsel kaldes 'tilsidesættelse'. Det opnås ved at bruge 'arv' og 'virtuelle funktioner'. Forud for funktionen, der skal tilsidesættes, foregår nøgleordet 'virtuel' i en baseklasse og omdefineres i en afledt klasse uden noget nøgleord.

En af de vigtigste ting at huske i tilfælde af tilsidesættelse er, at prototypen til den tilsidesatte funktion ikke må ændres, mens afledt klasse omdefinerer den. Når funktionen overstyres får et opkald, bestemmer C ++, hvilken version af funktionen der kaldes på baggrund af 'typen af ​​objektet peget af en markør', hvorpå funktionen, der kaldes, udføres.

Implementering af tilsidesættelse i C ++

class base {public: virtual void funct () {// virtual reality of base class cout << "Dette er en base classs funct ()"; }}; klasse afledt1: offentlig base {public: void funct () {// virtuel funktion af baseklasse omdefineret i afledt1 klasse cout << "Dette er en afledt1 klasser funktion ()"; }}; klasse afledt2: offentlig base {public: void funct () {// virtuel funktion af baseklasse omdefineret i deriv2 klasse cout << "Dette er en deriv22 ​​classs funktion ()"; }}; int main () {base * p, b; afledt1 d1; afledt2 d2; * P = & b; p-> funct (); // opkald til baseklasse funktion (). * P = & d1; p-> funct (); // opkald til afledt1 klasse funktion (). * P = & d2; p-> funct (); // opkald til deriv2 class funktion (). retur 0; }

Her er der en enkelt baseklasse, der er offentligt arvet af to afledte klasser. En virtuel funktion er defineret i en baseklasse med et nøgleord ‘virtuel’, og den omdefineres af begge de afledte klasser uden nøgleord. I hoved () opretter baseklasse en markørvariabel 'p' og et objekt 'b'; 'Afledt ′ klasse opretter et objekt d1 og afledt2 klasse opretter et objekt d2'.

Nu tildeles først adressen til baseklasseobjektet 'b' til markøren til baseklassen 'p'. 'P' giver et opkald til funktionsfunktionen (), så en funktion af basisklassen kaldes.Derefter tildeles adresse til afledt1 klasseobjekt 'd1' til markøren 'p', igen giver den opkald til funktion (); her udføres funktionsfunktioner () fra afledt klasse. Endelig tildeles pointeren 'p' til deriv2-klassens objekt. Derefter kaldes 'p' til funktionsfunktion (), der udfører funktionsfunktionerne () i deriv2-klassen.

Hvis deriv1 / deriv2-klassen ikke omdefinerede funktion (), ville funktionen () i baseklassen være blevet kaldt, da virtuel funktion er 'hierarkisk'.

  1. Prototypen på en funktion, der overbelastes, varierer på grund af typen og antallet af parametre, der sendes til den overbelastede funktion. På den anden side ændres prototypen på den tilsidesatte funktion ikke, fordi en overstyret funktion udfører forskellige handlinger for forskellige klasser, den hører til, men med samme type og antal parametre.
  2. Det overbelastede funktionsnavn går ikke foran med noget nøgleord, mens navnet på en tilsidesat funktion kun går foran keyordet "Virtuel" i baseklasse.
  3. Hvilken overbelastet funktion der påberåbes afhænger af typen eller antallet af parametre, der overføres til funktionen. Den tilsidesatte funktion, hvilken klasse aktiveres, afhænger af, hvilken klasses objektadresse er tildelt markøren, der påberåbte funktionen.
  4. Hvilken overbelastet funktion, der skal påberåbes, løses i kompileringstiden. Hvilken overstyret funktion, der skal påberåbes, løses i løbet af runtime.
  5. Konstruktører kan overbelastes, men kan ikke tilsidesættes.
  6. Destruktorer kan ikke overbelastes, men de kan tilsidesættes.
  7. Overbelastning opnår tidlig binding, da den overbelastede funktion, der påberåbes, løses i kompileringstiden. Overstyring opnår sen binding, da funktionen, som overstyres funktion, løses under kørsel.

ligheder

  1. Begge anvendes til medlemsfunktioner i en klasse.
  2. Polymorfisme er det grundlæggende koncept bag dem begge.
  3. Funktionsnavnet forbliver det samme, mens vi anvender overbelastning og tilsidesættelse af funktionerne.

Konklusion

Overbelastning og tilsidesættelse forekommer lignende, men dette er ikke tilfældet. Funktioner kan overbelastes, men enhver klasse kan ikke omdefinere den overbelastede funktion i fremtiden. En virtuel funktion kan ikke overbelastes; de kan kun tilsidesættes.