C++ Polimorfizam s primjerom

U čemu je polimorfizam C++?

In C++, polimorfizam uzrokuje drugačije ponašanje funkcije člana ovisno o objektu koji je poziva/poziva. Polimorfizam je grčka riječ koja znači imati mnogo oblika. To se događa kada imate hijerarhiju klasa povezanih putem nasljeđivanja.

Na primjer, pretpostavimo da imamo funkciju makeSound(). Kada mačka pozove ovu funkciju, proizvest će zvuk mijaukanja. Kada krava pozove istu funkciju, proizvest će zvuk miukanja.

Polimorfizam u C++

Iako imamo jednu funkciju, ona se ponaša drugačije u različitim okolnostima. Funkcija ima mnogo oblika; dakle, postigli smo polimorfizam.

Vrste polimorfizma

C++ podržava dvije vrste polimorfizma:

  • Polimorfizam u vrijeme kompajliranja, i
  • Polimorfizam vremena izvođenja.

Vrste polimorfizma

Polimorfizam vremena kompajliranja

Preopterećene funkcije pozivate podudaranjem broja i vrste argumenata. Informacije su prisutne tijekom vremena kompajliranja. Ovo znači C++ kompajler će odabrati pravu funkciju tijekom kompajliranja.

Polimorfizam u vrijeme prevođenja postiže se preopterećenjem funkcija i preopterećenjem operatora.

Preopterećenje funkcija

Preopterećenje funkcija događa se kada imamo mnogo funkcija sa sličnim imenima, ali različitim argumentima. Argumenti se mogu razlikovati po broju ili vrsti.

Primjer 1

#include <iostream> 
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;
}

Izlaz:

Preopterećenje funkcija

Evo snimke zaslona koda:

Preopterećenje funkcija

Objašnjenje koda:

  1. Uključite iostream datoteku zaglavlja u naš kod. Moći ćemo koristiti njegove funkcije.
  2. Uključite prostor imena std u naš kod. Moći ćemo koristiti njegove klase bez pozivanja.
  3. Napravite funkciju pod nazivom test koja uzima cjelobrojni parametar i. { označava početak tijela testa funkcije.
  4. Naredba koja će se izvršiti ako se dozove/pozove gornji test funkcije.
  5. Kraj tijela gornjeg testa funkcije.
  6. Napravite funkciju pod nazivom test koja uzima float parametar f. { označava početak tijela testa funkcije.
  7. Naredba koja će se izvršiti ako se dozove/pozove gornji test funkcije.
  8. Kraj tijela gornjeg testa funkcije.
  9. Napravite funkciju pod nazivom test koja uzima karakterni parametar ch. { označava početak tijela testa funkcije.
  10. Naredba koja će se izvršiti ako se dozove/pozove gornji test funkcije.
  11. Kraj tijela gornjeg testa funkcije.
  12. Pozovite funkciju main(). { označava početak tijela funkcije.
  13. Pozovite test funkcije i proslijedite mu 5 kao vrijednost argumenta. Time se poziva testna funkcija koja prihvaća cjelobrojni argument, to jest prva testna funkcija.
  14. Pozovite test funkcije i proslijedite mu 5.5 kao vrijednost argumenta. Ovo će pozvati testnu funkciju koja prihvaća argument float, to jest drugu testnu funkciju.
  15. Pozovite test funkcije i proslijedite mu pet kao vrijednost argumenta. Ovo će pozvati testnu funkciju koja prihvaća znakovni argument, odnosno treću testnu funkciju.
  16. Program mora vratiti vrijednost ako se uspješno izvodi.
  17. Kraj tijela funkcije main().

Imamo tri funkcije s istim imenom, ali različitim vrstama argumenata. Postigli smo polimorfizam.

Operator Preopterećenje

In Operaza preopterećenje, definiramo novo značenje za a C++ operater. Također mijenja način rada operatera. Na primjer, možemo definirati operator + za spajanje dva niza. Znamo ga kao operator zbrajanja za zbrajanje numeričkih vrijednosti. Nakon naše definicije, kada se postavi između cijelih brojeva, zbrajat će ih. Kada se postavi između nizova, spojit će ih.

Primjer 2

#include<iostream> 
using 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();
}

Izlaz:

Operator Preopterećenje

Evo snimke zaslona koda:

Operator Preopterećenje

Operator Preopterećenje

Objašnjenje koda:

  1. Uključite datoteku zaglavlja iostream u naš program kako biste koristili njegove funkcije.
  2. Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
  3. Napravite klasu pod nazivom ComplexNum. { označava početak tijela klase.
  4. Koristite modifikator privatnog pristupa za označavanje varijabli kao privatnih, što znači da im se može pristupiti samo iz klase.
  5. Definirajte dvije cjelobrojne varijable, real i over.
  6. Upotrijebite modifikator javnog pristupa da označite konstruktor kao javni, što znači da će biti dostupan čak i izvan razred.
  7. Napravite konstruktor klase i inicijalizirajte varijable.
  8. Inicijalizirajte vrijednost varijable real.
  9. Inicijalizirajte vrijednost varijable preko.
  10. Kraj tijela konstruktora.
  11. Moramo nadjačati značenje operatora +.
  12. Stvorite rezultat tipa podataka tipa ComplexNum.
  13. Koristite operator + sa složenim brojevima. Ovaj redak će dodati realni dio broja realnom dijelu drugog broja.
  14. Koristite operator + sa složenim brojevima. Ova linija će dodati imaginarni dio broja imaginarnom dijelu drugog broja.
  15. Program će vratiti vrijednost varijable rezultat nakon uspješnog izvođenja.
  16. Kraj definicije novog značenja + operatora, odnosno preopterećenja.
  17. Pozovite metodu print().
  18. Ispišite novi kompleksni broj nakon zbrajanja na konzoli.
  19. Kraj tijela print() funkcije.
  20. Kraj tijela klase ComplexNum.
  21. Pozovite funkciju main().
  22. Proslijedite vrijednosti i stvarnih i složenih dijelova koje treba dodati. Prvi dio od c1 će se dodati prvom dijelu od c2, to jest, 10+3. Drugi dio od c1 će se dodati drugom dijelu od c, to jest, 2+7.
  23. Izvedite operaciju koristeći preopterećeni operator + i pohranjujući rezultat u varijablu c3.
  24. Ispišite vrijednost varijable c3 na konzoli.
  25. Kraj tijela funkcije main().

Runtime polimorfizam

To se događa kada se metoda objekta dozove/pozove tijekom vremena izvođenja umjesto tijekom vremena kompajliranja. Polimorfizam vremena izvođenja postiže se nadjačavanjem funkcija. Funkcija koja se poziva/poziva uspostavlja se tijekom izvođenja.

Nadjačavanje funkcije

Nadjačavanje funkcije događa se kada funkcija osnovne klase dobije novu definiciju u izvedenoj klasi. U to vrijeme možemo reći da je osnovna funkcija nadjačana.

Na primjer:

#include <iostream>
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;

}

Izlaz:

Nadjačavanje funkcije

Evo snimke zaslona koda:

Nadjačavanje funkcije

Objašnjenje koda:

  1. Uvezite iostream datoteku zaglavlja u naš program da biste koristili njegove funkcije.
  2. Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
  3. Napravite klasu pod nazivom Mammal. { označava početak tijela klase.
  4. Upotrijebite modifikator javnog pristupa da postavite funkciju koju ćemo izraditi kao javno dostupnu. Bit će mu dostupno izvan ove klase.
  5. Stvorite javnu funkciju pod nazivom jesti. { označava početak tijela funkcije.
  6. Ispišite naredbu dodanu funkciji cout kada se pozove funkcija eat().
  7. Kraj tijela funkcije eat().
  8. Kraj tijela klase sisavaca.
  9. Napravite klasu pod nazivom Krava koja nasljeđuje klasu Sisavac. Krava je izvedena klasa, dok je sisavac osnovna klasa. { označava početak ove klase.
  10. Upotrijebite modifikator javnog pristupa da označite funkciju koju ćemo izraditi kao javno dostupnu. Bit će mu dostupno izvan ove klase.
  11. Nadjačajte funkciju eat() koja je definirana u osnovnoj klasi. { označava početak tijela funkcije.
  12. Naredba za ispis na konzoli kada se ova funkcija pozove.
  13. Kraj tijela funkcije eat().
  14. Kraj tijela klase Krava.
  15. Pozovite funkciju main(). { označava početak tijela ove funkcije.
  16. Napravite instancu klase Krava i dajte joj ime c.
  17. Pozovite funkciju eat() definiranu u klasi Cow.
  18. Program mora vratiti vrijednost nakon uspješnog završetka.
  19. Kraj funkcije main().

C++ Virtualna funkcija

Virtualna funkcija je još jedan način implementacije polimorfizma vremena izvođenja u C++. To je posebna funkcija definirana u osnovnoj klasi i redefinirana u izvedenoj klasi. Da biste deklarirali virtualnu funkciju, trebali biste koristiti ključnu riječ virtual. Ključna riječ treba prethoditi deklaraciji funkcije u osnovnoj klasi.

Ako je klasa virtualne funkcije naslijeđena, virtualna klasa redefinira virtualnu funkciju kako bi odgovarala svojim potrebama. Na primjer:

#include <iostream>  
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();      
	}

Izlaz:

C++ Virtualna funkcija

Evo snimke zaslona koda:

C++ Virtualna funkcija

Objašnjenje koda:

  1. Uključite datoteku zaglavlja iostreama u kod da biste koristili njegove funkcije.
  2. Uključite prostor imena std u naš kod da biste koristili njegove klase bez pozivanja.
  3. Napravite klasu pod nazivom ClassA.
  4. Koristite modifikator javnog pristupa da označite člana razreda kao javno dostupnog.
  5. Napravite virtualnu funkciju pod nazivom show(). Bit će to javna funkcija.
  6. Tekst za ispis kada se pozove pozvani show(). Kraj je a C++ ključna riječ, što znači završni redak. Pomiče kursor miša u sljedeći redak.
  7. Kraj tijela virtualne funkcije show().
  8. Kraj tijela klase ClassA.
  9. Stvaranje nove klase pod nazivom ClassB koja nasljeđuje klasu ClassA. ClassA postaje osnovna klasa dok ClassB postaje izvedena klasa.
  10. Koristite modifikator javnog pristupa da označite člana razreda kao javno dostupnog.
  11. Redefinirajte virtualnu funkciju show() izvedenu u osnovnoj klasi.
  12. Tekst za ispis na konzoli kada se pozove funkcija show() definirana u izvedenoj klasi.
  13. Kraj tijela funkcije show().
  14. Kraj tijela izvedene klase, ClassB.
  15. Pozovite funkciju main(). Programsku logiku treba dodati unutar njegovog tijela.
  16. Napravite varijablu pokazivača pod nazivom a. Pokazuje na klasu pod nazivom ClassA.
  17. Napravite instancu klase pod nazivom ClassB. Instanci se daje naziv b.
  18. Varijabli a dodijelite vrijednosti pohranjene na adresi b.
  19. Pozovite funkciju show() definiranu u izvedenoj klasi. Implementirano je kasno vezanje.
  20. Kraj tijela funkcije main().

Polimorfizam u vremenu kompajliranja vs. Polimorfizam u vremenu izvođenja

Evo glavnih razlika između to dvoje:

Polimorfizam kompilacije Polimorfizam u vremenu izvođenja
Također se naziva rano vezivanje ili statički polimorfizam Također se naziva kasno/dinamičko vezanje ili dinamički polimorfizam
Metoda se poziva/poziva tijekom vremena prevođenja Metoda se poziva/doziva tijekom vremena izvođenja
Implementirano preko preopterećenja funkcija i preopterećenja operatora Implementirano putem nadjačavanja metoda i virtualnih funkcija
Primjer, preopterećenje metode. Mnoge metode mogu imati slična imena, ali različit broj ili vrste argumenata Primjer, nadjačavanje metode. Mnoge metode mogu imati sličan naziv i isti prototip.
Brže izvođenje budući da se otkrivanje metoda vrši tijekom vremena prevođenja Sporije izvođenje budući da se otkrivač metoda obavlja tijekom vremena izvođenja.
Less omogućena je fleksibilnost za rješavanje problema budući da je sve poznato tijekom vremena prevođenja. Omogućena je velika fleksibilnost za rješavanje složenih problema jer se metode otkrivaju tijekom izvođenja.

Rezime

  • Polimorfizam znači imati mnogo oblika.
  • Javlja se kada postoji hijerarhija klasa povezanih nasljeđivanjem.
  • S polimorfizmom se funkcija može ponašati različito ovisno o objektu koji je poziva/poziva.
  • U polimorfizmu vremena prevođenja, funkcija koja se poziva uspostavlja se tijekom vremena prevođenja.
  • U polimorfizmu vremena izvođenja, funkcija koja se poziva uspostavlja se tijekom vremena izvođenja.
  • Polimorfizam u vrijeme prevođenja određen je preopterećenjem funkcija i preopterećenjem operatora.
  • Kod preopterećenja funkcija postoje mnoge funkcije sa sličnim imenima, ali različitim argumentima.
  • Parametri se mogu razlikovati prema broju ili vrsti.
  • Kod preopterećenja operatora definirano je novo značenje za C++ Operatori.
  • Polimorfizam vremena izvođenja postiže se nadjačavanjem funkcija.
  • U nadjačavanju funkcije, izvedena klasa daje novu definiciju funkciji definiranoj u osnovnoj klasi.

Dnevni bilten Guru99

Započnite dan s najnovijim i najvažnijim vijestima o umjetnoj inteligenciji koje vam donosimo upravo sada.