polymorphism c
De rol van polymorfisme in C ++ met voorbeelden.
Polymorfisme is een van de vier pijlers van objectgeoriënteerd programmeren. Polymorfisme betekent vele vormen hebben. Het kan worden gedefinieerd als de techniek waarmee een object vele vormen kan aannemen, afhankelijk van de situatie.
In programmeertermen kunnen we zeggen dat een object zich anders kan gedragen onder verschillende omstandigheden.
In deze tutorial zullen we in detail leren over de soorten polymorfisme, de manieren om polymorfisme te implementeren, samen met de verschillende andere concepten van polymorfisme.
Kijk hier om AZ van C ++ trainingshandleidingen hier te zien.
hoe eclipse c ++ te installeren
Bijvoorbeeld, een vrouw kan in verschillende situaties veel rollen aannemen. Voor een kind is ze een moeder, een huisvrouw thuis, een werkster op kantoor, enz. Een vrouw neemt dus verschillende rollen aan en vertoont ander gedrag in verschillende omstandigheden. Dit is een realistisch voorbeeld van polymorfisme.
Evenzo kunnen we ook in de programmeerwereld een operator '+' hebben, dat is de binaire opteloperator die zich anders gedraagt wanneer de operanden veranderen. Bijvoorbeeld, wanneer beide operanden numeriek zijn, voert het optelling uit.
Aan de andere kant, wanneer de operanden string zijn, fungeert het als aaneenschakelingsoperator. Polymorfisme betekent dus in een notendop dat een entiteit vele vormen aanneemt of zich onder verschillende omstandigheden anders gedraagt.
Wat je leert:
- Soorten polymorfisme
- Compile Time Polymorphism Vs. Runtime-polymorfisme
- Compileer tijdpolymorfisme
- Functie overbelasting
- Operator overbelasting
- Gevolgtrekking
- Aanbevolen literatuur
Soorten polymorfisme
Polymorfisme is onderverdeeld in twee typen.
- Compileer tijdpolymorfisme
- Runtime polymorfisme
Het diagram om dit weer te geven, wordt hieronder weergegeven:
Zoals te zien is in het bovenstaande diagram, is polymorfisme onderverdeeld in compilatietijdpolymorfisme en runtime-polymorfisme. Compilatietijdpolymorfisme is verder onderverdeeld in overbelasting van operators en overbelasting van functies. Runtime-polymorfisme wordt verder geïmplementeerd met behulp van virtuele functies.
Compilatietijd polymorfisme is ook bekend als vroeg bindend of statisch polymorfisme. In dit type polymorfisme wordt de methode van het object aangeroepen tijdens het compileren. In het geval van runtime-polymorfisme wordt de methode van het object tijdens runtime aangeroepen.
Runtime-polymorfisme is ook bekend als dynamisch of laat bindend of dynamisch polymorfisme. In onze volgende onderwerpen zullen we de gedetailleerde implementatie van elk van deze technieken bekijken.
Compile Time Polymorphism Vs. Runtime-polymorfisme
Laten we de belangrijkste verschillen tussen compilatietijd en runtime-polymorfisme hieronder bekijken.
Compileer tijdpolymorfisme | Runtime polymorfisme |
---|---|
Ook bekend als statisch polymorfisme of vroege binding | Ook bekend als dynamisch polymorfisme of late / dynamische binding |
De methode Objects wordt aangeroepen tijdens het compileren | De methode van het object wordt tijdens runtime aangeroepen |
Meestal geïmplementeerd met overbelasting van de operator en overbelasting van de functies | Geïmplementeerd met behulp van virtuele functies en overschrijven van methoden |
Method Overloading is een polymorfisme tijdens het compileren waarbij meer dan één methode dezelfde naam kan hebben, maar verschillende parameterlijsten en typen. | Methode-overschrijving is runtime-polymorfisme waarbij meer dan één methode dezelfde naam heeft met hetzelfde prototype |
Aangezien methoden bekend zijn tijdens het compileren, is de uitvoering sneller | De uitvoering is langzamer omdat de methode bekend is tijdens runtime |
Bied minder flexibiliteit om oplossingen te implementeren, aangezien alles tijdens het compileren bekend moet zijn | Veel flexibeler voor het implementeren van complexe oplossingen, aangezien de methoden tijdens runtime worden bepaald |
Compileer tijdpolymorfisme
Compilatietijdpolymorfisme is een techniek waarbij de methode van een object wordt aangeroepen tijdens het compileren.
Dit type polymorfisme wordt op twee manieren geïmplementeerd.
- Functie overbelast
- Operator overbelast
We zullen elke techniek in detail bespreken.
Functie overbelasting
Er wordt gezegd dat een functie overbelast is als we meer dan één functie hebben met dezelfde naam maar verschillende parametertypes of een ander aantal argumenten.
Zo kan een functie worden overbelast op basis van de parametertypes, de volgorde van parameters en het aantal parameters.
Merk op dat twee functies met dezelfde naam en dezelfde parameterlijst maar een verschillend retourtype geen overbelaste functie zijn en zullen resulteren in een compilatiefout als ze in het programma worden gebruikt.
Evenzo, als functieparameters alleen verschillen in pointer en als het type array equivalent is, dan mag het niet worden gebruikt voor overbelasting.
Andere typen zoals statisch en niet-statisch, const en vluchtig, enz. Of parameterverklaringen die verschillen in aanwezigheid of afwezigheid van standaardwaarden, mogen ook niet worden gebruikt voor overbelasting, aangezien ze equivalent zijn vanuit het oogpunt van implementatie.
Bijvoorbeeld,de volgende functieprototypes zijn overbelaste functies.
In de bovenstaande prototypes zien we dat we de functie Add overbelasten op basis van het type parameters, volgorde of volgorde van parameters, aantal parameters, etc.
Laten we een compleet programmeervoorbeeld nemen om Functie-overbelasting beter te begrijpen.
Uitgang:
35
191
19
Hallo Wereld
In het bovenstaande programma hebben we een Sommatieklasse die drie overbelaste functies heeft gedefinieerd, genaamd Add, waaraan twee integer-argumenten, drie integer-argumenten en twee string-argumenten moeten doorgegeven worden.
In de hoofdfunctie doen we vier functieaanroepen die verschillende parameters bieden. De eerste twee functieaanroepen zijn eenvoudig. In de derde functieaanroep van Add geven we twee drijvende-kommawaarden als argumenten.
In dit geval is de functie die overeenkomt int Add (int, int), want intern wordt de float geconverteerd naar double en vervolgens gekoppeld aan de functie met de int-parameters. Als we double hadden gespecificeerd in plaats van float, dan zouden we nog een overbelaste functie hebben met double als parameters.
nep e-mailadres dat ik kan gebruiken
De laatste functieaanroep gebruikt tekenreekswaarden als parameters. In dit geval fungeert de operator Toevoegen (+) als een aaneenschakelingsoperator en voegt de twee tekenreekswaarden samen om een enkele tekenreeks te produceren.
Voordelen van functie-overbelasting
Het belangrijkste voordeel van functie-overbelasting is dat het herbruikbaarheid van code bevordert. We kunnen zoveel mogelijk functies met dezelfde naam hebben, zolang ze maar overbelast zijn op basis van het argumenttype, de argumentvolgorde en het aantal argumenten.
Door dit te doen, wordt het gemakkelijker om verschillende functies met dezelfde naam te hebben om het gedrag van dezelfde bewerking onder verschillende omstandigheden weer te geven.
Als er geen functie-overbelasting aanwezig was, hadden we te veel verschillende soorten functies met verschillende namen moeten schrijven, waardoor de code onleesbaar en moeilijk aan te passen was.
Operator overbelasting
Operatoroverbelasting is de techniek waarmee we een andere betekenis geven aan de bestaande operators in C ++. Met andere woorden, we overbelasten de operatoren om een speciale betekenis te geven aan de door de gebruiker gedefinieerde gegevenstypen als objecten.
De meeste operators in C ++ zijn overbelast of krijgen een speciale betekenis, zodat ze kunnen werken met door de gebruiker gedefinieerde gegevenstypen. Merk op dat tijdens overbelasting de basiswerking van operators niet verandert. Overbelasting geeft de operator alleen een extra betekenis door hun basissemantiek hetzelfde te houden.
Hoewel de meeste operators in C ++ kunnen worden overbelast, zijn er enkele operators die niet kunnen worden overbelast.
Deze operators worden in de onderstaande tabel vermeld.
Operatoren |
---|
Scope resolutie operator (: :) |
De grootte van |
ledenkiezer (.) |
lid pointer selector (*) |
ternaire operator (? :) |
De functies die we gebruiken om operators te overbelasten worden ' Operator functies
Operatorfuncties zijn vergelijkbaar met de normale functies, maar met een verschil. Het verschil is dat de naam van de operatorfuncties begint met het trefwoord ' operator ”Gevolgd door het operatorsymbool dat moet worden overbelast.
De operatorfunctie wordt dan aangeroepen wanneer de corresponderende operator in het programma wordt gebruikt. Deze operatorfuncties kunnen de lidfuncties of globale methoden zijn of zelfs een vriendfunctie.
De algemene syntaxis van de operatorfunctie is:
Hier is 'operator op' de operatorfunctie waarbij de operator het sleutelwoord is en op de operator die moet worden overbelast. Return_type is het waardetype dat moet worden geretourneerd.
Laten we enkele programmeervoorbeelden bekijken om de overbelasting van de operator met behulp van operatorfuncties te demonstreren.
Voorbeeld 1:Overbelasting van de unaire operator met behulp van de functie van de operator.
Uitgang:
Verhoogde Feet-waarde: 10
Hier hebben we de unaire increment-operator overbelast met de operator ++ -functie. In de hoofdfunctie gebruiken we deze ++ operator om het object van de klasse Distance te verhogen.
Voorbeeld 2:Overbelasting van de binaire operator met behulp van de lidoperatorfunctie.
Uitgang:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
Hier hebben we het klassieke voorbeeld gebruikt van het optellen van twee complexe getallen met behulp van de operatoroverbelasting. We definiëren een klasse om complexe getallen weer te geven en een operatorfunctie om de + operator te overbelasten waarin we de reële en imaginaire delen van complexe getallen optellen.
In de hoofdfunctie declareren we twee complexe objecten en voegen ze toe met behulp van de overbelaste + operator om het gewenste resultaat te krijgen.
In het onderstaande voorbeeld zullen we de vriendfunctie gebruiken om twee complexe getallen toe te voegen om het verschil in implementatie te zien.
Uitgang:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
We zien dat de output van het programma hetzelfde is. Het enige verschil in de implementatie is het gebruik van de vriendfunctie om de + operator te overbelasten in plaats van een lidfunctie in de vorige implementatie.
Als de vriend-functie wordt gebruikt voor een binaire operator, moeten we expliciet beide operanden voor de functie specificeren. Evenzo, wanneer de unaire operator wordt overbelast met behulp van de vriendfunctie, moeten we de enkele operand aan de functie geven.
invoeging sorteeralgoritme c ++
Naast de operatorfuncties kunnen we ook een conversie-operator dat wordt gebruikt om van het ene type naar het andere te converteren. Deze overbelaste conversie-operators zouden een lidfunctie van de klasse moeten zijn.
Voorbeeld 3:Operator overbelasting met conversieoperator.
Uitgang:
De resulterende waarde van gegeven fractie (3,5) = 0,6
In dit programma hebben we de conversie-operator gebruikt om de gegeven breuk om te zetten in een float-waarde. Zodra de conversie is voltooid, retourneert de conversie-operator de resulterende waarde aan de beller.
Wanneer we in de hoofdfunctie het df-object toewijzen aan een res_val-variabele, vindt de conversie plaats en wordt het resultaat opgeslagen in res_val.
We kunnen ook een constructor aanroepen met een enkel argument. Wanneer we een constructor uit de klasse kunnen aanroepen met een enkel argument, wordt dit een ' conversie bouwer Conversion constructor kan worden gebruikt voor impliciete conversie naar de klasse die wordt geconstrueerd.
Uitgang:
Punt geconstrueerd met normale constructor
x = 20 y = 30
Punt geconstrueerd met behulp van conversie-constructor
x = 10 y = 0
Hier hebben we een klasse Point die een constructor met standaardwaarden definieert. In de hoofdfunctie construeren we een object pt met x- en y-coördinaten. Vervolgens kennen we pt gewoon een waarde van 10 toe. Dit is waar de conversieconstructor wordt aangeroepen en x krijgt een waarde van 10 toegewezen terwijl y de standaardwaarde 0 krijgt.
Regels voor overbelasting door operator
Bij overbelasting van de operator moeten we op de onderstaande regels letten.
- In C ++ kunnen we alleen de bestaande operators overbelasten. Nieuw toegevoegde operators kunnen niet worden overbelast.
- Als operators overbelast zijn, moeten we ervoor zorgen dat ten minste één van de operanden van het door de gebruiker gedefinieerde type is.
- Om bepaalde operators te overbelasten, kunnen we ook gebruik maken van de Friend-functie.
- Wanneer we unaire operators overbelasten met behulp van een lidfunctie, zijn er geen expliciete argumenten voor. Er is één expliciet argument nodig wanneer de unaire operator wordt overbelast met behulp van de vriendfunctie.
- Evenzo, wanneer binaire operatoren worden overbelast met de lidfunctie, moeten we een expliciet argument aan de functie geven. Wanneer binaire operatoren worden overbelast met de vriend-functie, heeft de functie twee argumenten nodig.
- Er zijn twee operators in C ++ die al overbelast zijn. Dit zijn '=' en '&'. Om een object van dezelfde klasse te kopiëren, hoeven we de operator = dus niet te overbelasten en kunnen we deze direct gebruiken.
Voordelen van overbelasting door de operator
Overbelasting van operators in C ++ stelt ons in staat om de functionaliteit van operators uit te breiden naar de door de gebruiker gedefinieerde typen, inclusief klasseobjecten naast de ingebouwde typen.
Door de operatorfunctionaliteit uit te breiden naar de door de gebruiker gedefinieerde typen, hoeven we geen complexe code te schrijven om verschillende bewerkingen op door de gebruiker gedefinieerde typen uit te voeren, maar we kunnen het in één bewerking zelf doen, net als de ingebouwde typen.
Gevolgtrekking
Compilatietijdpolymorfisme biedt een overbelastingsfaciliteit, voornamelijk om de functionaliteit van de code uit te breiden in termen van functie-overbelasting en overbelasting van de operator.
Door functie-overbelasting kunnen we meer dan één functie schrijven met dezelfde naam maar met verschillende parameters en typen. Dit maakt de code eenvoudig en goed leesbaar. Door overbelasting van operators kunnen we de functionaliteit van operators uitbreiden, zodat we ook basishandelingen kunnen uitvoeren op door de gebruiker gedefinieerde typen.
In onze aanstaande tutorial zullen we meer leren over runtime polymorfisme in C ++.
Lees de Easy C ++ Training Series door.
Aanbevolen literatuur
- Runtime-polymorfisme in C ++
- Vriendfuncties in C ++
- Recursie in C ++
- Python Main Function-zelfstudie met praktische voorbeelden
- Een compleet overzicht van C ++
- QTP Tutorial # 21 - QTP-tests modulair en herbruikbaar maken met acties en functiebibliotheken
- Unix Pipes-zelfstudie: Pipes in Unix-programmering
- Bibliotheekfuncties in C ++