logo

C++ polymorfi

Ordet polymorfi betyder at have mange former. Med enkle ord kan vi definere polymorfi som en beskeds evne til at blive vist i mere end én form. Et virkeligt eksempel på polymorfi er en person, der på samme tid kan have forskellige egenskaber. En mand er på samme tid en far, en mand og en medarbejder. Så den samme person udviser forskellig adfærd i forskellige situationer. Dette kaldes polymorfi. Polymorfi betragtes som et af de vigtige træk ved objektorienteret programmering.

Typer af polymorfi

  • Kompileringstidspolymorfi
  • Runtime polymorfisme
Typer af polymorfi

Typer af polymorfi

1. Kompileringstidspolymorfi

Denne type polymorfi opnås ved funktionsoverbelastning eller operatøroverbelastning.



A. Funktionsoverbelastning

Når der er flere funktioner med samme navn, men forskellige parametre, så siges funktionerne at være det overbelastet, derfor er dette kendt som funktionsoverbelastning. Funktioner kan overbelastes af ændring af antallet af argumenter eller/og ændre typen af ​​argumenter . Enkelt sagt er det en funktion ved objektorienteret programmering, der giver mange funktioner, der har samme navn, men forskellige parametre, når adskillige opgaver er opført under ét funktionsnavn. Der er visse regler for funktionsoverbelastning, som skal følges, mens en funktion overbelastes.

Nedenfor er C++-programmet til at vise funktionsoverbelastning eller kompileringstidspolymorfi:

C++




// C++ program to demonstrate> // function overloading or> // Compile-time Polymorphism> #include> using> namespace> std;> class> Geeks {> public>:> >// Function with 1 int parameter> >void> func(>int> x)> >{> >cout <<>'value of x is '> << x << endl;> >}> >// Function with same name but> >// 1 double parameter> >void> func(>double> x)> >{> >cout <<>'value of x is '> << x << endl;> >}> >// Function with same name and> >// 2 int parameters> >void> func(>int> x,>int> y)> >{> >cout <<>'value of x and y is '> << x <<>', '> << y> ><< endl;> >}> };> // Driver code> int> main()> {> >Geeks obj1;> >// Function being called depends> >// on the parameters passed> >// func() is called with int value> >obj1.func(7);> >// func() is called with double value> >obj1.func(9.132);> >// func() is called with 2 int values> >obj1.func(85, 64);> >return> 0;> }>

>

objekt af array i java

>

Produktion

value of x is 7 value of x is 9.132 value of x and y is 85, 64>

Forklaring: I ovenstående eksempel er en enkelt funktion navngivet funktion func() handler forskelligt i tre forskellige situationer, hvilket er en egenskab ved polymorfi. For at vide mere om dette, kan du henvise til artiklen - Funktion Overbelastning i C++ .

B. Operatør Overbelastning

C++ har evnen til at give operatørerne en særlig betydning for en datatype, denne evne er kendt som operatøroverbelastning. For eksempel kan vi bruge additionsoperatoren (+) for strengklasse til at sammenkæde to strenge. Vi ved, at denne operatørs opgave er at tilføje to operander. Så en enkelt operator '+' tilføjer dem, når de placeres mellem heltalsoperander, og sammenkæder dem, når de placeres mellem strengoperander.

Nedenfor er C++-programmet til at demonstrere operatøroverbelastning:

CPP




er tom java

// C++ program to demonstrate> // Operator Overloading or> // Compile-Time Polymorphism> #include> using> namespace> std;> class> Complex {> private>:> >int> real, imag;> public>:> >Complex(>int> r = 0,>int> i = 0)> >{> >real = r;> >imag = i;> >}> >// This is automatically called> >// when '+' is used with between> >// two Complex objects> >Complex operator+(Complex>const>& obj)> >{> >Complex res;> >res.real = real + obj.real;> >res.imag = imag + obj.imag;> >return> res;> >}> >void> print() { cout << real <<>' + i'> << imag << endl; }> };> // Driver code> int> main()> {> >Complex c1(10, 5), c2(2, 4);> >// An example call to 'operator+'> >Complex c3 = c1 + c2;> >c3.print();> }>

>

>

postordregennemgang
Produktion

12 + i9>

Forklaring: I ovenstående eksempel er operatoren '+' overbelastet. Normalt bruges denne operator til at tilføje to tal (heltal eller flydende kommatal), men her er operatoren lavet til at udføre addition af to imaginære eller komplekse tal. For at vide mere om denne, se artiklen - Operatør overbelastning .

2. Runtime Polymorphism

Denne type polymorfi opnås ved Funktion tilsidesætte . Sen binding og dynamisk polymorfi er andre navne for runtime polymorfi. Funktionskaldet løses ved runtime in runtime polymorfi . I modsætning hertil bestemmer compileren med kompileringstidspolymorfi, hvilket funktionskald der skal bindes til objektet efter at have udledt det ved kørsel.

A. Funktionstilsidesættelse

Funktion tilsidesætte opstår, når en afledt klasse har en definition for en af ​​medlemsfunktionerne i basisklassen. Den basisfunktion siges at være tilsidesat.

Funktionstilsidesættelse i C++

Funktion tilsidesætte Forklaring

Runtime polymorfisme med datamedlemmer

Runtime Polymorphism kan ikke opnås af datamedlemmer i C++. Lad os se et eksempel, hvor vi får adgang til feltet efter referencevariabel for overordnet klasse, som refererer til forekomsten af ​​den afledte klasse.

C++




// C++ program for function overriding with data members> #include> using> namespace> std;> // base class declaration.> class> Animal {> public>:> >string color =>'Black'>;> };> // inheriting Animal class.> class> Dog :>public> Animal {> public>:> >string color =>'Grey'>;> };> // Driver code> int> main(>void>)> {> >Animal d = Dog();>// accessing the field by reference> >// variable which refers to derived> >cout << d.color;> }>

>

>

Produktion

Black>

Vi kan se, at den overordnede klassereference altid vil referere til datamedlemmet i den overordnede klasse.

B. Virtuel funktion

EN virtuel funktion er en medlemsfunktion, der er erklæret i basisklassen ved hjælp af nøgleordet virtual og omdefineres (Overridden) i den afledte klasse.

regexp_like i mysql

Nogle nøglepunkter om virtuelle funktioner:

  • Virtuelle funktioner er dynamiske.
  • De defineres ved at indsætte nøgleordet virtuelle inde i en basisklasse og er altid deklareret med en basisklasse og tilsidesat i en underklasse
  • En virtuel funktion kaldes under Runtime

Nedenfor er C++-programmet til at demonstrere virtuel funktion:

C++




// C++ Program to demonstrate> // the Virtual Function> #include> using> namespace> std;> // Declaring a Base class> class> GFG_Base {> public>:> >// virtual function> >virtual> void> display()> >{> >cout <<>'Called virtual Base Class function'> ><<>' '>;> >}> >void> print()> >{> >cout <<>'Called GFG_Base print function'> ><<>' '>;> >}> };> // Declaring a Child Class> class> GFG_Child :>public> GFG_Base {> public>:> >void> display()> >{> >cout <<>'Called GFG_Child Display Function'> ><<>' '>;> >}> >void> print()> >{> >cout <<>'Called GFG_Child print Function'> ><<>' '>;> >}> };> // Driver code> int> main()> {> >// Create a reference of class GFG_Base> >GFG_Base* base;> >GFG_Child child;> >base = &child;> >// This will call the virtual function> >base->GFG_Base::display();> >// this will call the non-virtual function> >base->print();> }>

>

>

Produktion

Called virtual Base Class function Called GFG_Base print function>

Eksempel 2:

C++




// C++ program for virtual function overriding> #include> using> namespace> std;> class> base {> public>:> >virtual> void> print()> >{> >cout <<>'print base class'> << endl;> >}> >void> show() { cout <<>'show base class'> << endl; }> };> class> derived :>public> base {> public>:> >// print () is already virtual function in> >// derived class, we could also declared as> >// virtual void print () explicitly> >void> print() { cout <<>'print derived class'> << endl; }> >void> show() { cout <<>'show derived class'> << endl; }> };> // Driver code> int> main()> {> >base* bptr;> >derived d;> >bptr = &d;> >// Virtual function, binded at> >// runtime (Runtime polymorphism)> >bptr->print();> >// Non-virtual function, binded> >// at compile time> >bptr->vis();> >return> 0;> }>

>

definere computer
>

Produktion

print derived class show base class>