Anbefalt, 2024

Redaksjonens

Forskjell mellom funksjonsoverbelastning og overstyring i C ++

Polymorfisme er en av de viktigste funksjonene i OOP. Det betyr bare 'å bruke ett navn for flere skjemaer'. Polymorfisme kan implementeres ved bruk av funksjon overbelastning, operatør overbelastning og virtuell funksjon. Både "overbelastning" og "tvingende" innebærer begrepet polymorfisme. Her er "overbelastning" kompilert tidspolymorfisme og "overordnet" er kjøretidspolymorfisme. Studier videre, hvis vi snakker om den store forskjellen i "overbelastning" og "tvingende". I 'overbelastning' omdefinerer vi de overbelastede funksjonene med samme funksjonsnavn, men forskjellige nummer og type parametere. I "overordnet" prototype overstyrt funksjon er det samme gjennom hele programmet, men funksjonen som skal overstyres, er foran søkeordet "virtuelt" i grunnklassen og omdefineres av den avledede klassen uten søkeord.

Videre studerer vi forskjellen mellom overbelastning og overstyring ved hjelp av et sammenligningsdiagram.


Sammenligningstabel:

Grunnlag for sammenligningoverbelastningOverstyre
prototypePrototypen er forskjellig ettersom antall eller type parametere kan variere.Alt aspekt av prototypen må være det samme.
søkeordIngen søkeord ble brukt under overbelastning.Funksjon som skal overstyres, er forhåndsført av nøkkelordet "virtuelt", i grunnklassen.
Distinguishing faktorNummer eller type av parameter er forskjellig som bestemmer hvilken versjon av funksjonen som kalles.Hvilken klasses funksjon blir kalt av pekeren, bestemmes av, adressen til hvilken klassens objekt er tilordnet den pekeren.
Definere mønsterFunksjonen er omdefinert med samme navn, men forskjellig antall og type parameter.Funksjonen er definert, etterfulgt av et søkeord "virtuelt" i hovedklassen og omdefinert av avledet klasse uten søkeord.
Tidspunkt for oppnåelseKompilere tid.Kjøretid.
Konstruer / Virtual funksjonKonstruksjonene kan overbelastes.Virtuell funksjon kan overstyres.
Destructor
Destructor kan ikke overbelastes.Destructor kan overstyres.
bindingOverbelastning oppnår tidlig binding.Overstyring refererer til sen binding.

Definisjon av overbelastning

Kompileringstidspolymorfisme kalles overbelastning. Ettersom overbelastning genereres fra et konsept av polymorfisme, gir det "et felles grensesnitt for flere metoder". Det betyr at hvis en funksjon er overbelastet, inneholder den samme funksjonsnavn mens det er omdefinert.

Overbelastede funksjoner varierer med hensyn til, forskjellige "antall eller type av parameter (er)", det gjør en overbelastet funksjon forskjellig fra en annen. På denne måten gjenkjenner kompilatoren hvilken overbelastet funksjon som kalles. Mest overbelastede funksjoner er "konstruktører". 'Copy constructor' er en slags "konstruktør overbelastning".

Implementering av overbelastning i C ++

 klasse overbelastning {int a, b; offentlig: int belastning (int x) {// første belastning () funksjon a = x; returnere a; } int belastning (int x, int y) {// andre belastning () funksjon a = x; b = y; returner a * b; }}; int main () {overload O1; O1.load (20); // første belastning () funksjonsanrop O1.load (20, 40); // andre last () funksjonsanrop} 

Her er funksjonsbelastningen () for overbelastning av klasse overbelastet. De to overbelastede funksjonene til klassen kan skelnes på en måte at førstlast () -funksjonen bare aksepterer et heltallsparameter, mens den andre belastningen () -funksjonen aksepterer to heltallsparametere. Når objektet til klassen overbelastning kaller funksjonen last () med en enkelt parameter, blir førstlast () -funksjonen kalt. Når objektsamtaler last () -funksjonen passerer to parametere, blir andre last () -funksjonen kalt.

Definisjon av overstyring

Polymorfisme oppnådd i løpet av kjøretiden kalles "overordnet". Det oppnås ved å bruke 'arv' og 'virtuelle funksjoner'. Funksjon som skal overstyres, er foran søkeordet "virtuelt" i en grunnklasse og omdefinert i en avledet klasse uten søkeord.

En av de viktigste ting å huske i tilfelle tvingende er at prototypen for overstyrt funksjonen ikke må endres mens avledet klasse omdefinerer den. Når overstyrt funksjon blir gitt en samtale, bestemmer C ++ hvilken versjon av funksjonen som kalles basert på typen av objektet peket av en peker, hvor funksjonen ringer er gjort.

Gjennomføring av overstyring i C ++

 klassebase {public: virtual void funct () {// virtuell funksjon av base class cout << "Dette er en grunnklassens funksjon ()"; }}; klasse derived1: offentlig base {public: void funct () {// virtuell funksjon av grunnklassen omdefinert i derived1 class cout << "Dette er en derived1 class funksjon ()"; }}; klasse derived2: offentlig base {public: void funct () {// virtuell funksjon av grunnklassen omdefinert i derived2 class cout  funksjo (); // ring til derived1 class funct (). * P = & d2; p-> funksjo (); // kall til derived2 class funct (). returner 0; } 

Her er det en enkelt base klasse som er arvet av to avledede klasser. En virtuell funksjon er definert i en baseklasse med et søkeord 'virtuelt', og det er omdefinert av begge avledede klasser uten søkeord. I hoved () baserer grunnklassen en pekervariabel 'p' og et objekt 'b'; 'derived1'-klassen skaper et objekt d1 og derived2-klassen skaper et objekt d2'.

I utgangspunktet er adressen til basisklassens objekt 'b' tilordnet pekeren til baseklassen 'p'. 'p' ringer til funksjonsfunksjonen (), så en funksjon av baseklassen kalles. Da er adressen til derived1 class objektet 'd1' tilordnet pekeren 'p', igjen gir den anrop til funct (); her blir funksjonsfunksjonen () av ​​derived1-klassen utført. Endelig er pekeren 'p' tilordnet objektet derived2-klassen. Deretter kalles 'p' funksjonsfunksjon () som kjører funk func () av ​​derived2-klassen.

Hvis avledet1 / derived2-klassen ikke redefinerte funct (), ville funct () av ​​grunnklassen ha blitt kalt, da virtuell funksjon er 'hierarkisk'.

Viktige forskjeller mellom overbelastning og overstyring

  1. Prototypen til en funksjon som overbelastes, er forskjellig på grunn av type og antall parametere som sendes til overbelastet funksjon. På den annen side endres prototypen for overstyringsfunksjonen fordi en overstyrt funksjon utfører forskjellig handling for annen klasse den tilhører, men med samme type og antall parametere.
  2. Det overbelastede funksjonsnavnet foregår ikke med noen søkeord, mens navnet på en overstyrt funksjon foregår med nøkkelordet "Virtual" bare i grunnklassen.
  3. Hvilken overbelastet funksjon er påkalt avhenger av typen eller antall parametere som sendes til funksjonen. Den overstyrte funksjonen til hvilken klasse er påkalt, avhenger av hvilken klassens objektadresse som er tilordnet pekeren, som påkalte funksjonen.
  4. Hvilken overbelastet funksjon som skal påberopes, er løst under kompileringstid. Hvilken overstyrt funksjon som skal påberopes, er løst under kjøretid.
  5. Konstruktører kan overbelastes, men kan ikke overstyres.
  6. Destruktorer kan ikke overbelastes, men de kan overstyres.
  7. Overbelastning oppnår tidlig binding som hvilken overbelastet funksjon vil bli påkalt, er løst under kompileringstid. Overstyring oppnår sen binding som den overstyrte funksjonen vil påberope er løst under kjøretid.

likheter

  1. Begge brukes til medlemsfunksjoner i en klasse.
  2. Polymorfisme er det grunnleggende konseptet bak begge deler.
  3. Funksjonsnavn forblir det samme mens vi overbelaster og overstyrer funksjonene.

Konklusjon

Overbelastning og overstyring virker likt, men dette er ikke tilfelle. Funksjonene kan overbelastes, men noen klasser kan ikke videre omdefinere den overbelastede funksjonen i fremtiden. En virtuell funksjon kan ikke overbelastes; de kan bare overstyres.

Top