logo

C++ polimorfizmas

Žodis polimorfizmas reiškia turėti daug formų. Paprastais žodžiais tariant, polimorfizmą galime apibrėžti kaip pranešimo gebėjimą rodyti daugiau nei viena forma. Realus polimorfizmo pavyzdys yra asmuo, kuris tuo pačiu metu gali turėti skirtingas savybes. Vyras tuo pačiu metu yra ir tėvas, ir vyras, ir darbuotojas. Taigi tas pats asmuo skirtingose ​​situacijose elgiasi skirtingai. Tai vadinama polimorfizmu. Polimorfizmas laikomas vienu iš svarbių objektinio programavimo bruožų.

Polimorfizmo rūšys

  • Kompiliavimo laiko polimorfizmas
  • Vykdymo laiko polimorfizmas
Polimorfizmo rūšys

Polimorfizmo rūšys



1. Kompiliavimo laiko polimorfizmas

Šio tipo polimorfizmas pasiekiamas perkraunant funkciją arba operatoriaus perkrovą.

A. Funkcijų perkrova

Kai yra kelios funkcijos tuo pačiu pavadinimu, bet skirtingais parametrais, tada sakoma, kad funkcijos yra perkrautas, todėl tai žinoma kaip funkcijų perkrova. Funkcijos gali būti perkrautos argumentų skaičiaus keitimas arba/ir keičiant argumentų tipą . Paprastais žodžiais tariant, tai yra objektinio programavimo ypatybė, suteikianti daug funkcijų, turinčių tą patį pavadinimą, bet skirtingus parametrus, kai daugybė užduočių yra išvardytos vienu funkcijos pavadinimu. Yra tam tikrų funkcijų perkrovimo taisyklių, kurių reikia laikytis perkraunant funkciją.

Žemiau yra C++ programa, rodanti funkcijų perkrovimą arba kompiliavimo laiko polimorfizmą:



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;> }>

>

cp komanda Linux

>

Išvestis

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

Paaiškinimas: Aukščiau pateiktame pavyzdyje viena funkcija pavadinta funkcija func() trijose skirtingose ​​situacijose veikia skirtingai, o tai yra polimorfizmo savybė. Norėdami sužinoti daugiau apie tai, galite perskaityti straipsnį - Funkcijų perkrovimas C++ .

B. Operatoriaus perkrova

C++ turi galimybę suteikti operatoriams ypatingą reikšmę duomenų tipui, ši galimybė žinoma kaip operatoriaus perkrova. Pavyzdžiui, galime panaudoti sudėjimo operatorių (+), skirtą eilučių klasei, norėdami sujungti dvi eilutes. Žinome, kad šio operatoriaus užduotis yra pridėti du operandus. Taigi vienas operatorius „+“, patalpintas tarp sveikųjų operandų, juos prideda, o tarp eilinių operandų juos sujungia.

Žemiau yra C++ programa, skirta parodyti operatoriaus perkrovą:

CPP




rūšiuoti masyvų sąrašą 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();> }>

>

>

Išvestis

12 + i9>

Paaiškinimas: Aukščiau pateiktame pavyzdyje operatorius „+“ yra perkrautas. Paprastai šis operatorius naudojamas dviem skaičiams (sveikiesiems skaičiams arba slankiojo kablelio skaičiams) pridėti, tačiau čia operatorius priverstas pridėti du įsivaizduojamus arba kompleksinius skaičius. Norėdami sužinoti daugiau apie tai, skaitykite straipsnį - Operatoriaus perkrova .

2. Vykdymo laiko polimorfizmas

Šio tipo polimorfizmas pasiekiamas Funkcijų nepaisymas . Vėlyvasis surišimas ir dinaminis polimorfizmas yra kiti vykdymo laiko polimorfizmo pavadinimai. Funkcijos iškvietimas išsprendžiamas vykdymo metu vykdymo laiko polimorfizmas . Priešingai, esant kompiliavimo laiko polimorfizmui, kompiliatorius nustato, kurį funkcijos iškvietimą susieti su objektu, išvedęs jį vykdymo metu.

A. Funkcijų nepaisymas

Funkcijų nepaisymas įvyksta, kai išvestinė klasė turi vienos iš pagrindinės klasės narių funkcijų apibrėžimą. Sakoma, kad ši pagrindinė funkcija yra nepaisoma.

konvertuoti eilutę į int Java
Funkcijų nepaisymas C++

Funkcija viršesnė Paaiškinimas

Vykdymo laiko polimorfizmas su duomenų nariais

Vykdymo laiko polimorfizmo negali pasiekti C++ duomenų nariai. Pažiūrėkime pavyzdį, kai pasiekiame lauką naudodami pirminės klasės nuorodos kintamąjį, kuris nurodo išvestinės klasės egzempliorių.

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;> }>

>

>

Išvestis

Black>

Matome, kad pagrindinės klasės nuoroda visada bus nuoroda į pirminės klasės duomenų narį.

B. Virtuali funkcija

A virtualią funkciją yra nario funkcija, kuri deklaruojama pagrindinėje klasėje naudojant raktinį žodį virtual ir iš naujo apibrėžiama (Nepaisoma) išvestinėje klasėje.

Keletas pagrindinių dalykų apie virtualias funkcijas:

  • Virtualios funkcijos yra dinamiškos.
  • Jie apibrėžiami įterpiant raktinį žodį virtualus pagrindinėje klasėje ir visada deklaruojami su bazine klase ir nepaisomi antrinėje klasėje
  • Vykdymo metu iškviečiama virtuali funkcija

Žemiau yra C++ programa, skirta parodyti virtualią funkciją:

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->spausdinti();> }>

pėdos prieš pėdą
>

>

Išvestis

laikotarpio raktas
Called virtual Base Class function Called GFG_Base print function>

2 pavyzdys:

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->spausdinti();> >// Non-virtual function, binded> >// at compile time> >bptr->rodyti();> >return> 0;> }>

>

>

Išvestis

print derived class show base class>