C ++ polymorfisme med eksempel

Indholdsfortegnelse:

Anonim

Hvad er polymorfisme i C ++?

I C ++ får polymorfisme en medlemsfunktion til at opføre sig forskelligt baseret på det objekt, der kalder / påberåber det. Polymorfisme er et græsk ord, der betyder at have mange former. Det sker, når du har et hierarki af klasser relateret gennem arv.

Antag for eksempel, at vi har funktionen makeSound (). Når en kat kalder denne funktion, producerer den meow-lyden. Når en ko påberåber sig den samme funktion, vil den give moow-lyden.

Selvom vi har en funktion, opfører den sig anderledes under forskellige omstændigheder. Funktionen har mange former; derfor har vi opnået polymorfisme.

I denne C ++ tutorial lærer du:

  • Hvad er polymorfisme?
  • Typer af polymorfisme
  • Kompilér tidspolymorfisme
  • Funktion Overbelastning
  • Operatør Overbelastning
  • Runtime polymorfisme
  • Overstyring af funktion
  • C ++ virtuel funktion
  • Kompileringstidspolymorfisme vs. Kørselstidspolymorfisme

Typer af polymorfisme

C ++ understøtter to typer polymorfisme:

  • Kompileringstidspolymorfisme og
  • Runtime polymorfisme.

Kompilér tidspolymorfisme

Du påberåber de overbelastede funktioner ved at matche antallet og typen af ​​argumenter. Oplysningerne er til stede under kompileringstiden. Dette betyder, at C ++ - kompilatoren vælger den rigtige funktion på kompileringstidspunktet.

Kompileringstidspolymorfisme opnås gennem funktionsoverbelastning og operatøroverbelastning.

Funktion Overbelastning

Funktionsoverbelastning opstår, når vi har mange funktioner med lignende navne, men forskellige argumenter. Argumenterne kan variere med hensyn til antal eller type.

Eksempel 1:

#include using namespace std;void test(int i) {cout << " The int is " << i << endl;}void test(double f) {cout << " The float is " << f << endl;}void test(char const *ch) {cout << " The char* is " << ch << endl;}int main() {test(5);test(5.5);test("five");return 0;}

Produktion:

Her er et screenshot af koden:

Kode Forklaring:

  1. Inkluder iostream header-filen i vores kode. Vi vil være i stand til at bruge dens funktioner.
  2. Inkluder std navneområdet i vores kode. Vi vil være i stand til at bruge dets klasser uden at kalde det.
  3. Opret en funktion med navnet test, der tager et heltalsparameter i. {Markerer starten på kroppen af ​​funktionstesten.
  4. Erklæring, der skal udføres, hvis ovenstående funktionstest påberåbes / kaldes.
  5. Slutningen af ​​kroppen af ​​ovenstående funktionstest.
  6. Opret en funktion med navnet test, der tager en floatparameter f. {Markerer starten på kroppen af ​​funktionstesten.
  7. Erklæring, der skal udføres, hvis ovenstående funktionstest påberåbes / kaldes.
  8. Slutningen af ​​kroppen af ​​ovenstående funktionstest.
  9. Opret en funktion med navnet test, der tager en tegnparameter ch. {Markerer starten på kroppen af ​​funktionstesten.
  10. Erklæring, der skal udføres, hvis ovenstående funktionstest påberåbes / kaldes.
  11. Slutningen af ​​kroppen af ​​ovenstående funktionstest.
  12. Ring til hovedfunktionen (). {Markerer begyndelsen på funktionens krop.
  13. Kald funktionstesten og send 5 til den som værdien af ​​argumentet. Dette påberåber testfunktionen, der accepterer et heltalargument, det vil sige den første testfunktion.
  14. Kald funktionstesten og send 5.5 til den som værdien af ​​argumentet. Dette påkalder testfunktionen, der accepterer et float-argument, det vil sige den anden testfunktion.
  15. Kald funktionstesten og send fem til den som værdien af ​​argumentet. Dette påkalder testfunktionen, der accepterer et tegnargument, det vil sige den tredje testfunktion.
  16. Programmet skal returnere en værdi, hvis det kører med succes.
  17. Slutningen af ​​hovedfunktionens () krop.

Vi har tre funktioner med samme navn, men forskellige typer argumenter. Vi har opnået polymorfisme.

Operatør Overbelastning

I operatøroverbelastning definerer vi en ny betydning for en C ++ - operatør. Det ændrer også, hvordan operatøren arbejder. For eksempel kan vi definere + operatoren til at sammenkæde to strenge. Vi kender det som tilføjelsesoperator for at tilføje numeriske værdier. Når vores definition er placeret mellem heltal, tilføjer den dem. Når den placeres mellem strengene, sammenkædes den.

Eksempel 2:

#includeusing namespace std;class ComplexNum {private:int real, over;public:ComplexNum(int rl = 0, int ov = 0) {real = rl;over = ov;}ComplexNum operator + (ComplexNum const &obj) {ComplexNum result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){ComplexNum c1(10, 2), c2(3, 7);ComplexNum c3 = c1+c2;c3.print();}

Produktion:

Her er et screenshot af koden:

Kode Forklaring:

  1. Inkluder iostream header-filen i vores program for at kunne bruge dens funktioner.
  2. Inkluder std navneområdet i vores program for at kunne bruge dets klasser uden at kalde det.
  3. Opret en klasse med navnet ComplexNum. {Markerer begyndelsen på klassens krop.
  4. Brug den private adgangsmodifikator til at markere variabler som private, hvilket betyder at de kun kan tilgås inden for klassen.
  5. Definer to heltalsvariabler, reelle og over.
  6. Brug den offentlige adgangsmodifikator til at markere konstruktøren som offentlig, hvilket betyder at den vil være tilgængelig selv uden for klassen.
  7. Opret klassekonstruktøren, og initialiser variablerne.
  8. Initialiser værdien af ​​den variable real.
  9. Initialiser værdien af ​​variablen over.
  10. Slutningen af ​​konstruktørorganet.
  11. Vi er nødt til at tilsidesætte + operatorens betydning.
  12. Opret datatyperesultatet af typen ComplexNum.
  13. Brug + -operatoren med komplekse tal. Denne linje tilføjer den reelle del af et tal til den rigtige del af et andet nummer.
  14. Brug + -operatoren med komplekse tal. Denne linje tilføjer den imaginære del af et tal til den imaginære del af et andet nummer.
  15. Programmet returnerer værdien af ​​det variable resultat efter en vellykket udførelse.
  16. Slutningen af ​​definitionen af ​​den nye betydning af + operator, det vil sige overbelastning.
  17. Ring til udskrivningsmetoden ().
  18. Udskriv det nye komplekse nummer efter tilføjelse på konsollen.
  19. Slutningen af ​​udskrivningsfunktionens () funktion.
  20. Slutningen af ​​kroppen i ComplexNum-klassen.
  21. Ring til hovedfunktionen ().
  22. Videregiv værdierne for både reelle og komplekse dele, der skal tilføjes. Den første del af c1 føjes til den første del af c2, det vil sige 10 + 3. Den anden del af c1 føjes til den anden del af c, det vil sige 2 + 7.
  23. Udfør en operation ved hjælp af den overbelastede + operator og lagring af resultatet i variabel c3.
  24. Udskriv værdien af ​​variabel c3 på konsollen.
  25. Slutningen af ​​hovedfunktionen ().

Runtime polymorfisme

Dette sker, når et objekts metode påberåbes / kaldes under runtime snarere end under kompileringstid. Runtime polymorfisme opnås gennem tilsidesættelse af funktioner. Funktionen, der skal kaldes / påberåbes, oprettes under kørselstid.

Overstyring af funktion

Funktionsoverstyring opstår, når en funktion af baseklassen får en ny definition i en afledt klasse. På det tidspunkt kan vi sige, at basisfunktionen er blevet tilsidesat.

For eksempel:

#include using namespace std;class Mammal {public:void eat() {cout << "Mammals eat… ";}};class Cow: public Mammal {public:void eat() {cout << "Cows eat grass… ";}};int main(void) {Cow c = Cow();c.eat();return 0;}

Produktion:

Her er et screenshot af koden:

Kode Forklaring:

  1. Importer iostream headerfilen til vores program for at bruge dens funktioner.
  2. Inkluder std navneområdet i vores program for at kunne bruge dets klasser uden at kalde det.
  3. Opret en klasse ved navn Mammal. {Markerer begyndelsen på klassens krop.
  4. Brug den offentlige adgangsmodifikator til at indstille den funktion, vi er ved at oprette, som offentligt tilgængelig. Det vil være tilgængeligt uden for denne klasse.
  5. Opret en offentlig funktion med navnet eat. {Markerer begyndelsen på funktionslegemet.
  6. Udskriv den erklæring, der er tilføjet til cout-funktionen, når funktionen eat () påberåbes.
  7. I slutningen af ​​kroppen af ​​funktion spiser ().
  8. Slutningen af ​​kroppen af ​​klassen Pattedyr.
  9. Opret en klasse med navnet Cow, der arver Mammal-klassen. Ko er den afledte klasse, mens Pattedyr er basisklassen. {Markerer begyndelsen på denne klasse.
  10. Brug den offentlige adgangsmodifikator til at markere den funktion, vi er ved at oprette, som offentligt tilgængelig. Det vil være tilgængeligt uden for denne klasse.
  11. Tilsidesæt funktionen eat (), der blev defineret i basisklassen. {Markerer begyndelsen på funktionslegemet.
  12. Erklæringen, der skal udskrives på konsollen, når denne funktion påberåbes.
  13. Slutningen af ​​kroppen af ​​funktionen spis ().
  14. Slutningen af ​​kroppen af ​​klassen Ko.
  15. Ring til hovedfunktionen (). {Markerer begyndelsen på kroppen for denne funktion.
  16. Opret en instans af Cow-klassen og giv den navnet c.
  17. Kald funktionen eat (), der er defineret i Cow-klassen.
  18. Programmet skal returnere en værdi, når den er gennemført.
  19. Slut på hovedfunktionen ().

C ++ virtuel funktion

En virtuel funktion er en anden måde at implementere run-time polymorfisme i C ++ på. Det er en speciel funktion defineret i en basisklasse og omdefineret i den afledte klasse. For at erklære en virtuel funktion skal du bruge det virtuelle nøgleord. Nøgleordet skal være forud for funktionens erklæring i basisklassen.

Hvis en virtuel funktionsklasse arves, omdefinerer den virtuelle klasse den virtuelle funktion, så den passer til dens behov. For eksempel:

#include using namespace std;class ClassA {public:virtual void show() {cout << "The show() function in base class invoked… " << endl;}};class ClassB :public ClassA {public:void show() {cout << "The show() function in derived class invoked… ";}};int main() {ClassA* a;ClassB b;a = &b;a->show();}

Produktion:

Her er et screenshot af koden:

Kode Forklaring:

  1. Inkluder iostream headerfilen i koden for at bruge dens funktioner.
  2. Inkluder std navneområdet i vores kode for at bruge dets klasser uden at kalde det.
  3. Opret en klasse med navnet ClassA.
  4. Brug den offentlige adgangsmodifikator til at markere et klassemedlem som offentligt tilgængeligt.
  5. Opret en virtuel funktion ved navn show (). Det vil være en offentlig funktion.
  6. Den tekst, der skal udskrives, når showet () påberåbes, påberåbes. Endl er et C ++ nøgleord, hvilket betyder slutlinie. Den flytter musemarkøren til den næste linje.
  7. Slutningen af ​​det virtuelle funktions show ().
  8. Slutningen af ​​kroppen i klasse ClassA.
  9. Oprettelse af en ny klasse ved navn ClassB, der arver klassen ClassA. ClassA bliver basisklassen, mens ClassB bliver den afledte klasse.
  10. Brug den offentlige adgangsmodifikator til at markere et klassemedlem som offentligt tilgængeligt.
  11. Omdefiner det virtuelle funktions show (), der er afledt i basisklassen.
  12. Teksten, der skal udskrives på konsollen, når funktionen show () defineret i den afledte klasse påberåbes.
  13. Slutningen af ​​showet () -funktionens hoveddel.
  14. Slutningen af ​​kroppen af ​​den afledte klasse, klasseB.
  15. Ring til hovedfunktionen (). Programmets logik skal tilføjes i dets krop.
  16. Opret en markørvariabel med navnet a. Det peger på klassen ved navn ClassA.
  17. Opret en forekomst af klassen ved navn ClassB. Forekomsten får navnet b.
  18. Tildel værdilagrene i adressen b i variablen a.
  19. Påkald funktionen show (), der er defineret i den afledte klasse. Sen binding er implementeret.
  20. Slutningen af ​​hovedfunktionens () krop.

Kompileringstidspolymorfisme vs. Kørselstidspolymorfisme

Her er de største forskelle mellem de to:

Kompileringstidspolymorfisme Kørselstidspolymorfisme
Det kaldes også tidlig binding eller statisk polymorfisme Det kaldes også sen / dynamisk binding eller dynamisk polymorfisme
Metoden kaldes / påberåbes under kompileringstid Metoden kaldes / påberåbes i løbet af løbetiden
Implementeret via funktionsoverbelastning og operatøroverbelastning Implementeret via metodeoverstyring og virtuelle funktioner
Eksempel på metodeoverbelastning. Mange metoder kan have lignende navne, men forskellige antal eller typer af argumenter Eksempel, metode tilsidesat. Mange metoder kan have et lignende navn og den samme prototype.
Hurtigere udførelse, da metoderne findes i løbet af kompileringstiden Langsommere udførelse, da metodefinderen udføres under kørselstid.
Mindre fleksibilitet til problemløsning tilvejebringes, da alt er kendt i kompileringstiden. Der tilvejebringes meget fleksibilitet til løsning af komplekse problemer, da metoder opdages under kørsel.

Resumé:

  • Polymorfisme betyder at have mange former.
  • Det sker, når der er et hierarki af klasser relateret til arv.
  • Med polymorfisme kan en funktion opføre sig forskelligt baseret på det objekt, der påberåber / kalder det.
  • I kompileringstidspolymorfisme etableres den funktion, der skal påberåbes, under kompileringstid.
  • I runtime polymorfisme etableres den funktion, der skal påberåbes under runtime.
  • Kompileringstidspolymorfisme bestemmes gennem funktionsoverbelastning og operatøroverbelastning.
  • I funktionsoverbelastning er der mange funktioner med lignende navne, men forskellige argumenter.
  • Parametrene kan variere i antal eller type.
  • Ved overbelastning af operatører defineres en ny betydning for C ++ -operatører.
  • Runtime polymorfisme opnås gennem tilsidesættelse af funktioner.
  • I funktionsoverstyring giver en afledt klasse en ny definition til en funktion defineret i basisklassen.