Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> C Taal

C++ Polymorfisme met Voorbeeld

Wat is polymorfisme in C++?

In C++ zorgt polymorfisme ervoor dat een lidfunctie zich anders gedraagt ​​op basis van het object dat deze aanroept/oproept. Polymorfisme is een Grieks woord dat vele vormen betekent. Het komt voor wanneer u een hiërarchie van klassen hebt die via overerving zijn gerelateerd.

Stel dat we bijvoorbeeld de functie makeSound() hebben. Wanneer een kat deze functie aanroept, zal hij het miauwgeluid produceren. Wanneer een koe dezelfde functie aanroept, zal zij het maaigeluid geven.

Hoewel we één functie hebben, gedraagt ​​deze zich onder verschillende omstandigheden anders. De functie heeft vele vormen; daarom hebben we polymorfisme bereikt.

In deze C++ tutorial leer je:

  • Wat is polymorfisme?
  • Soorten polymorfisme
  • Compileertijdpolymorfisme
  • Functie overbelasten
  • Operator overbelast
  • Runtime-polymorfisme
  • Functie overschrijven
  • C++ virtuele functie
  • Compile-time polymorfisme vs. Runtime-polymorfisme

Soorten polymorfisme

C++ ondersteunt twee soorten polymorfisme:

  • Compile-time polymorfisme, en
  • Runtime-polymorfisme.

Compileertijdpolymorfisme

Je roept de overbelaste functies aan door het aantal en het type argumenten te matchen. De informatie is aanwezig tijdens het compileren. Dit betekent dat de C++-compiler tijdens het compileren de juiste functie selecteert.

Compile-time polymorfisme wordt bereikt door overbelasting van functies en overbelasting van de operator.

Functie overbelasting

Overbelasting van functies treedt op wanneer we veel functies hebben met vergelijkbare namen maar met verschillende argumenten. De argumenten kunnen verschillen in aantal of soort.

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

Uitvoer:

Hier is een screenshot van de code:

Code uitleg:

  1. Neem het iostream-headerbestand op in onze code. We zullen de functies ervan kunnen gebruiken.
  2. Neem de std-naamruimte op in onze code. We kunnen zijn klassen gebruiken zonder hem te bellen.
  3. Maak een functie met de naam test waaraan een integer-parameter i moet doorgegeven worden. De { markeert het begin van de body-of-functietest.
  4. Opdracht die moet worden uitgevoerd als de bovenstaande functietest wordt aangeroepen/aangeroepen.
  5. Einde van de hoofdtekst van bovenstaande functietest.
  6. Maak een functie met de naam test die een float-parameter f nodig heeft. De { markeert het begin van de body-of-functietest.
  7. Opdracht die moet worden uitgevoerd als de bovenstaande functietest wordt aangeroepen/aangeroepen.
  8. Einde van de body van de bovenstaande functietest.
  9. Maak een functie met de naam test die een tekenparameter ch nodig heeft. De { markeert het begin van de body-of-functietest.
  10. Opdracht die moet worden uitgevoerd als de bovenstaande functietest wordt aangeroepen/aangeroepen.
  11. Einde van de body van de bovenstaande functietest.
  12. Roep de functie main() aan. De { markeert het begin van de hoofdtekst van de functie.
  13. Roep de functietest aan en geef er 5 aan als de waarde van het argument. Hiermee wordt de testfunctie aangeroepen die een integer-argument accepteert, dat wil zeggen de eerste testfunctie.
  14. Roep de functietest aan en geef er 5.5 aan door als de waarde van het argument. Hiermee wordt de testfunctie aangeroepen die een float-argument accepteert, dat wil zeggen de tweede testfunctie.
  15. Noem de functietest en geef er vijf aan als de waarde van het argument. Hiermee wordt de testfunctie aangeroepen die een tekenargument accepteert, dat wil zeggen de derde testfunctie.
  16. Het programma moet een waarde teruggeven als het succesvol wordt uitgevoerd.
  17. Het einde van de hoofdtekst van de functie main().

We hebben drie functies met dezelfde naam maar verschillende soorten argumenten. We hebben polymorfisme bereikt.

Operator overbelasting

In Operator Overloading definiëren we een nieuwe betekenis voor een C++-operator. Het verandert ook hoe de operator werkt. We kunnen bijvoorbeeld de operator + definiëren om twee strings samen te voegen. We kennen het als de opteloperator voor het optellen van numerieke waarden. Na onze definitie, wanneer geplaatst tussen gehele getallen, zal het ze optellen. Wanneer het tussen strings wordt geplaatst, worden ze samengevoegd.

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

Uitvoer:

Hier is een screenshot van de code:

Code uitleg:

  1. Voeg het iostream-headerbestand toe aan ons programma om de functies ervan te gebruiken.
  2. Neem de std-naamruimte op in ons programma om de klassen te gebruiken zonder deze aan te roepen.
  3. Maak een klasse met de naam ComplexNum. De { markeert het begin van de class body.
  4. Gebruik de modifier voor privétoegang om variabelen als privé te markeren, wat betekent dat ze alleen toegankelijk zijn vanuit de klas.
  5. Definieer twee integer-variabelen, reëel en groter.
  6. Gebruik de modifier voor openbare toegang om de constructor als openbaar te markeren, wat betekent dat deze zelfs van buiten de klas toegankelijk is.
  7. Maak de klassenconstructor en initialiseer de variabelen.
  8. Initialiseer de waarde van de variabele real.
  9. Initialiseer de waarde van de variabele over.
  10. Einde van de constructor-body.
  11. We moeten de betekenis van de operator + overschrijven.
  12. Maak het resultaat van het gegevenstype van het type ComplexNum.
  13. Gebruik de operator + bij complexe getallen. Deze regel voegt het reële deel van een getal toe aan het reële deel van een ander getal.
  14. Gebruik de operator + bij complexe getallen. Deze regel voegt het denkbeeldige deel van een getal toe aan het denkbeeldige deel van een ander getal.
  15. Het programma retourneert de waarde van het variabele resultaat bij succesvolle uitvoering.
  16. Einde van de definitie van de nieuwe betekenis van + operator, dat wil zeggen overbelasting.
  17. Roep de methode print() aan.
  18. Druk het nieuwe complexe nummer af na toevoeging op de console.
  19. Einde van de hoofdtekst van de functie print().
  20. Einde van de hoofdtekst van de klasse ComplexNum.
  21. Roep de functie main() aan.
  22. Geef de waarden door van zowel reële als complexe delen die moeten worden toegevoegd. Het eerste deel van c1 wordt opgeteld bij het eerste deel van c2, dat wil zeggen 10+3. Het tweede deel van c1 wordt toegevoegd aan het tweede deel van c, dat wil zeggen 2+7.
  23. Voer een bewerking uit met de operator overloaded + en sla het resultaat op in variabele c3.
  24. Druk de waarde van variabele c3 af op de console.
  25. Einde van de hoofdtekst van de functie main().

Runtime polymorfisme

Dit gebeurt wanneer de methode van een object wordt aangeroepen/aangeroepen tijdens runtime in plaats van tijdens het compileren. Runtime-polymorfisme wordt bereikt door functieoverschrijving. De functie die moet worden aangeroepen/aangeroepen, wordt tijdens runtime tot stand gebracht.

Functie negeren

Functieoverschrijven treedt op wanneer een functie van de basisklasse een nieuwe definitie krijgt in een afgeleide klasse. Op dat moment kunnen we zeggen dat de basisfunctie is overschreven.

Bijvoorbeeld:

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

}

Uitvoer:

Hier is een screenshot van de code:

Code uitleg:

  1. Importeer het iostream-headerbestand in ons programma om de functies ervan te gebruiken.
  2. Neem de std-naamruimte op in ons programma om de klassen te gebruiken zonder deze aan te roepen.
  3. Maak een klasse met de naam Mammal. De { markeert het begin van de class body.
  4. Gebruik de modifier voor openbare toegang om de functie die we gaan maken als openbaar toegankelijk in te stellen. Het is toegankelijk van buiten deze klas.
  5. Maak een openbare functie met de naam eat. De { markeert het begin van de functietekst.
  6. Druk de instructie af die aan de functie cout is toegevoegd wanneer de functie eat() wordt aangeroepen.
  7. Het einde van het lichaam van functie eat().
  8. Einde van het lichaam van de klas Zoogdier.
  9. Maak een klasse met de naam Koe die de klasse Zoogdier erft. Koe is de afgeleide klasse, terwijl zoogdier de basisklasse is. De { markeert het begin van deze klasse.
  10. Gebruik de modifier voor openbare toegang om de functie die we gaan maken als openbaar toegankelijk te markeren. Het zal toegankelijk zijn van buiten deze klasse.
  11. Overschrijf de functie eat() die is gedefinieerd in de basisklasse. De { markeert het begin van de functietekst.
  12. De instructie die op de console moet worden afgedrukt wanneer deze functie wordt aangeroepen.
  13. Einde van de hoofdtekst van de functie eat().
  14. Einde van het lichaam van de klas Koe.
  15. Roep de functie main() aan. De { markeert het begin van de hoofdtekst van deze functie.
  16. Maak een instantie van de klasse Cow en geef deze de naam c.
  17. Roep de functie eat() aan die is gedefinieerd in de klasse Cow.
  18. Het programma moet een waarde retourneren na succesvolle voltooiing.
  19. Einde van de functie main().

C++ virtuele functie

Een virtuele functie is een andere manier om runtime-polymorfisme in C++ te implementeren. Het is een speciale functie gedefinieerd in een basisklasse en opnieuw gedefinieerd in de afgeleide klasse. Om een ​​virtuele functie te declareren, moet u het virtuele trefwoord gebruiken. Het sleutelwoord moet voorafgaan aan de declaratie van de functie in de basisklasse.

Als een virtuele functieklasse wordt geërfd, herdefinieert de virtuele klasse de virtuele functie om aan zijn behoeften te voldoen. Bijvoorbeeld:

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

Uitvoer:

Hier is een screenshot van de code:

Code uitleg:

  1. Neem het iostream-headerbestand op in de code om de functies ervan te gebruiken.
  2. Neem de std-naamruimte op in onze code om de klassen te gebruiken zonder deze aan te roepen.
  3. Maak een klasse met de naam ClassA.
  4. Gebruik de modifier voor openbare toegang om een ​​klaslid als openbaar toegankelijk te markeren.
  5. Maak een virtuele functie met de naam show(). Het wordt een publieke functie.
  6. De tekst die moet worden afgedrukt wanneer de aangeroepen show() wordt aangeroepen. De endl is een C++-sleutelwoord, wat eindregel betekent. Het verplaatst de muiscursor naar de volgende regel.
  7. Einde van de hoofdtekst van de virtuele functie show().
  8. Einde van de body van de klasse ClassA.
  9. Een nieuwe klasse maken met de naam ClassB die de klasse ClassA erft. KlasseA wordt de basisklasse, terwijl KlasseB de afgeleide klasse wordt.
  10. Gebruik de modifier voor openbare toegang om een ​​klaslid als openbaar toegankelijk te markeren.
  11. Definieer de virtuele functie show() die is afgeleid van de basisklasse opnieuw.
  12. De tekst die op de console moet worden afgedrukt wanneer de functie show() die is gedefinieerd in de afgeleide klasse, wordt aangeroepen.
  13. Einde van de hoofdtekst van de functie show().
  14. Einde van de hoofdtekst van de afgeleide klasse, ClassB.
  15. Roep de functie main() aan. De programmalogica moet in de body worden toegevoegd.
  16. Maak een pointervariabele met de naam a. Het verwijst naar de klasse met de naam ClassA.
  17. Maak een instantie van de klasse met de naam ClassB. De instantie krijgt de naam b.
  18. Wijs de waardenopslag in het adres b toe aan de variabele a.
  19. Roep de functie show() op die is gedefinieerd in de afgeleide klasse. Late binding is geïmplementeerd.
  20. Einde van de hoofdtekst van de functie main().

Compile-time polymorfisme vs. Runtime-polymorfisme

Dit zijn de belangrijkste verschillen tussen de twee:

Compile-time polymorfisme Runtime polymorfisme Het wordt ook vroege binding of statisch polymorfisme genoemd. Het wordt ook late/dynamische binding of dynamisch polymorfisme genoemd. De methode wordt aangeroepen/aangeroepen tijdens de compileertijd. De methode wordt aangeroepen/aangeroepen tijdens runtime. Geïmplementeerd via overbelasting van functies en overbelasting door operators. Veel methoden kunnen vergelijkbare namen hebben, maar een ander aantal of verschillende typen argumenten. Voorbeeld, methode die overschrijft. Veel methoden hebben mogelijk een vergelijkbare naam en hetzelfde prototype. Snellere uitvoering omdat de methoden worden ontdekt tijdens de compileertijd. Langzamere uitvoering omdat de methode-ontdekker wordt uitgevoerd tijdens runtime. Er is minder flexibiliteit voor het oplossen van problemen, omdat alles bekend is tijdens de compileertijd. Veel flexibiliteit is bedoeld voor het oplossen van complexe problemen, aangezien methoden tijdens runtime worden ontdekt.

Samenvatting:

  • Polymorfisme betekent vele vormen hebben.
  • Het komt voor wanneer er een hiërarchie is van klassen die door overerving zijn gerelateerd.
  • Met polymorfisme kan een functie zich anders gedragen op basis van het object dat de functie aanroept/aanroept.
  • In compile-time polymorfisme wordt de functie die moet worden aangeroepen tijdens het compileren vastgesteld.
  • Bij runtime-polymorfisme wordt de aan te roepen functie tijdens runtime vastgesteld.
  • Compile-time polymorfisme wordt bepaald door overbelasting van functies en overbelasting door operators.
  • Bij functieoverbelasting zijn er veel functies met vergelijkbare namen maar met verschillende argumenten.
  • De parameters kunnen verschillen in aantal of type.
  • Bij overbelasting van operators is een nieuwe betekenis gedefinieerd voor C++-operators.
  • Runtime-polymorfisme wordt bereikt door functieoverschrijving.
  • Bij het overschrijven van functies geeft een afgeleide klasse een nieuwe definitie aan een functie die is gedefinieerd in de basisklasse.

C Taal

  1. Array doorgeven aan een functie in C++-programmering
  2. Operators in C++ met voorbeeld:wat is, typen en programma's
  3. C++ Switch Case Statement met VOORBEELD
  4. C++ Dynamische toewijzing van arrays met voorbeeld
  5. Overbelasting van C++-operator met voorbeelden
  6. C++-structuur met voorbeeld
  7. std::lijst in C++ met Voorbeeld
  8. C++-functies met programmavoorbeelden
  9. Verschil tussen structuur en klasse:uitgelegd met C++-voorbeeld
  10. calloc() Functie in C-bibliotheek met programma VOORBEELD
  11. free() Functie in C-bibliotheek:Hoe te gebruiken? Leer met voorbeeld