Verschil tussen virtuele en pure virtuele functie

Schrijver: Laura McKinney
Datum Van Creatie: 2 April 2021
Updatedatum: 13 Kunnen 2024
Anonim
Virtual Function vs Pure Virtual Function|Difference between virtual and pure virtual function
Video: Virtual Function vs Pure Virtual Function|Difference between virtual and pure virtual function

Inhoud


De virtuele functie en pure virtuele functie zijn beide de concepten van polymorfisme tijdens runtime. Het belangrijkste verschil tussen ‘virtuele functie ' en ‘Pure virtuele functie’ is dat ‘virtuele functie’ zijn definitie heeft in de basisklasse en ook de erfelijke afgeleide klassen deze opnieuw definiëren. De pure virtuele functie heeft geen definitie in de basisklasse en alle erfelijke afgeleide klassen moeten deze opnieuw definiëren.

De virtuele functie wordt echter ook wel dynamische verzending en runtime-verzending genoemd, vanwege de aangeroepen functie wordt opgegeven in de runtime in overeenstemming met het type object dat wordt gebruikt.

Polymorfisme wordt ondersteund door zowel de talen C ++ als Java. In Java wordt de term 'opheffen' gebruikt in plaats van 'virtuele functie', omdat de virtuele functie de term C ++ is.

  1. Vergelijkingstabel
  2. Definitie
  3. Belangrijkste verschillen
  4. Gevolgtrekking

Vergelijkingstabel

Basis voor vergelijkingVirtuele functiePure virtuele functie
basis-Virtuele functie heeft hun definitie in de basisklasse.Pure Virtual Function heeft geen definitie in de basisklasse.
Verklaringvirtuele functnaam (parameterlijst) {. . . . .};virtuele functnaam (parameterlijst) = 0;
Afgeleide klasseAlle afgeleide klassen kunnen de virtuele functie van de basisklasse al dan niet overschrijven.Alle afgeleide klassen moeten de virtuele functie van de basisklasse overschrijven.
Effect

Virtuele functies zijn hiërarchisch van aard; het heeft geen invloed op de compilatie als afgeleide klassen de virtuele functie van de basisklasse niet overschrijven.Als alle afgeleide klassen de virtuele functie van de basisklasse niet overschrijven, treedt de compilatiefout op.
Abstracte klasseGeen concept.Als een klasse ten minste één pure virtuele functie bevat, wordt deze abstract verklaard.


Definitie van virtuele functie

De virtuele functie is de lidfunctie van de basisklasse en wordt opnieuw gedefinieerd door de afgeleide klassen die de basisklasse erven. Het is niet noodzakelijk dat alle overgeërfde afgeleide klassen de virtuele functie opnieuw moeten definiëren, het wordt alleen opnieuw gedefinieerd door die afgeleide klassen waarvoor het mogelijk nodig is. Een virtuele functie wordt gecreëerd door de functie aan te geven in de basisklasse, voorafgegaan door het trefwoord ‘Virtuele’.

Verklaring :

klassenbasis {public: virtueel type funt_name (parameterlijst) {. . . }};

De overgeërfde afgeleide klassen kunnen de virtuele functie opnieuw definiëren zonder een ‘virtueel’ trefwoord. Afgeleide klassen definiëren de virtuele functie opnieuw om zijn taak te volbrengen. Omdat de virtuele functie opnieuw wordt gedefinieerd in afgeleide klassen, hebben we meerdere vormen van dezelfde functie. Welke versie van de functie wordt genoemd, hangt nu af van het soort object waarnaar die functie wordt opgeroepen.


Overerving op meerdere niveaus

Bij overerving op meerdere niveaus, waarbij een afgeleide klasse die de virtuele functie van zijn basisklasse heeft geërfd, wanneer deze zelf wordt gebruikt als een basisklasse voor een andere afgeleide klasse, de virtuele functie nog steeds kan worden genegeerd. Dus wanneer een virtuele functie wordt geërfd, wordt ook de virtuele aard ervan geërfd.

Virtuele functies zijn ook hiërarchisch van aard, d.w.z. als een afgeleide klasse de virtuele functie die is geërfd van de basisklasse niet overschrijft / opnieuw definieert en wanneer het object van de afgeleide klasse die virtuele functie oproept, wordt de virtuele functie die is gedefinieerd door de basisklasse aangeroepen.

Definitie van pure virtuele functie

Zoals hierboven gezien als afgeleide klasse de virtuele functie niet overschrijft, wordt de virtuele functie gebruikt die is gedefinieerd door de basisklasse. Maar wat als de basisklasse zelf de virtuele functie niet definieert. Vaak heeft de basisklasse geen definitie voor de virtuele functie, of soms wilt u dat alle afgeleide klassen de virtuele functie moeten vervangen.

Om deze bovenstaande twee situaties aan te pakken, ondersteunt C ++ het concept van 'Pure virtuele functie“. Een ‘pure virtuele functie’ wordt gedeclareerd in de basisklasse maar heeft geen definitie in de basisklasse. De pure virtuele functie wordt als volgt verklaard.

virtueel type functnaam (parameterlijst) = 0;

Wanneer een virtuele functie in de basisklasse 'puur' wordt gemaakt, moet elke afgeleide klasse verplicht de zuivere virtuele functie van de basisklasse overschrijven. Als de afgeleide klasse de pure virtuele functie van de basisklasse niet overschrijft, leidt dit tot een compilatiefout.

Abstracte klasse

De klasse die ten minste één pure functie bevat, wordt ‘abstracte klasse’ genoemd. Er kunnen geen objecten van abstracte klassen worden gemaakt, maar u kunt verwijzingen en verwijzingen naar abstracte klassen maken. Leden van de abstracte klassen zijn toegankelijk via het object van de afgeleide klassen dat de abstracte basisklasse erft.

Gebruik een trefwoord om een ​​klasse abstract te verklaren 'abstract' voor de 'klasse' trefwoord.

// bijvoorbeeld abstract class class-name {. . virtueel type functnaam (parameterlijst) = 0; . . };

  1. Virtuele functies zijn zeker gedefinieerd in de basisklasse en opnieuw gedefinieerd (overschrijven) in de afgeleide klasse. Aan de andere kant, pure virtuele functie de basisklasse is met name niet gedefinieerd in de basisklasse
  2. Afgeleide klasse herdefinieert (vervangt) indien nodig de virtuele functie, terwijl in het geval van pure virtuele functie afgeleide klasse de pure virtuele functie absoluut opnieuw moet definiëren.
  3. Als de afgeleide klasse de virtuele functie niet opnieuw definieert (overschrijft), kan deze de virtuele functie van de basisklasse gebruiken. Omgekeerd, als een afgeleide klasse de pure virtuele functie niet overschrijft, treedt er een compilatiefout op.
  4. Basisklasse met de virtuele functie kan worden gestart, d.w.z. het object kan worden gemaakt. De basisklasse met pure virtuele functie, d.w.z. een abstracte klasse, kan niet worden geïnstantieerd omdat een abstracte klasse niet volledig is gedefinieerd.

Opmerking:
Het prototype van de ‘virtuele functie’ en ‘pure virtuele functie’ blijft gedurende het programma hetzelfde.

Gevolgtrekking:

De 'virtuele functies' en 'pure virtuele functie' hebben beide hun belang, omdat in 'virtuele functies' niet alle afgeleide klasse de virtuele functie opnieuw hoeft te definiëren en waar we willen dat alle afgeleide klasse de virtuele functie opnieuw definieert, pure virtueel functie is daar het beste van toepassing.