Hoe virtuele functie in C ++ te implementeren?



Dit artikel laat je kennismaken met nog een ander programmeerconcept: virtuele functie in C ++. Het concept wordt ondersteund door demonstraties.

Een virtuele functie in C ++ is een lidfunctie binnen de basisklasse die we opnieuw definiëren in een afgeleide klasse. Dit artikel helpt je het concept in detail te verkennen. Volgende aanwijzingen komen in dit artikel aan bod,

Dus laten we aan de slag gaan met dit artikel over virtuele functie in C ++





Wat is virtuele functie?

Een virtuele functie is een lidfunctie binnen de basisklasse die we opnieuw definiëren in een afgeleide klasse. Het wordt gedeclareerd met behulp van het virtuele sleutelwoord. Wanneer een klasse met een virtuele functie wordt overgeërfd, herdefinieert de afgeleide klasse de virtuele functie om aan zijn eigen behoeften te voldoen.

def __init __ (zelf):

Verderop met dit artikel over virtuele functie in C ++



Regels voor virtuele functie in C ++:

  • Ze worden altijd gedefinieerd in een basisklasse en overschreven in een afgeleide klasse, maar het is niet verplicht om ze te overschrijven in de afgeleide klasse.
  • De virtuele functies moeten worden gedeclareerd in het openbare gedeelte van de klasse.
  • Ze kunnen niet statisch zijn of de vriendenfunctie kan ook niet de virtuele functie van een andere klasse zijn.
  • De virtuele functies moeten worden geopend met behulp van een aanwijzer om runtime-polymorfisme te bereiken.

Verderop met dit artikel over virtuele functie in C ++.

Wat is bindend?

Binding voor functies betekent dat overal waar een functieaanroep is, de compiler moet weten aan welke functiedefinitie deze moet worden gekoppeld. Dit hangt af van de ondertekening van elke functieverklaring en de opdrachten die worden uitgevoerd. De compiler moet ook weten dat wanneer deze overeenkomst tussen de functieaanroep en het kiezen van de juiste definitie zal plaatsvinden.

Verderop met dit artikel over virtuele functie in C ++



Vroege binding

Vroege binding is een fenomeen waarbij de beslissing om verschillende functieaanroepen te matchen plaatsvindt tijdens het compileren zelf en de compiler de link direct associeert met adressen. Het is ook bekend als Static Binding of Compile-time Binding.

  • Zoals we weten, schrijven we code in de taal op hoog niveau
  • Vervolgens zet de compiler dit om in een taal op laag niveau die de computer kan begrijpen, meestal machinetaal op het moment van compilatie
  • Bij vroege binding geeft de compiler direct het adres van de functie-declaratie-instructie aan de functie-aanroepinstructie
  • Zoals de naam suggereert, vindt de binding dus heel vroeg plaats voordat het programma wordt uitgevoerd.

Voorbeeld

#inclusief het gebruik van de naamruimte std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // vroege binding return 0}

Uitvoer

Output - Virtuele functie in C ++ - Edureka

verduidelijkingen ion
In dit voorbeeld hebben we een pointer a gemaakt naar de bovenliggende klasse Animals. Door vervolgens a = & c te schrijven, begon de aanwijzer ‘a’ te verwijzen naar het object c van de klasse Cats.
a -> sound () - Bij het aanroepen van de functie sound () die in beide klassen aanwezig is door de pointer 'a', werd de functie van de bovenliggende klasse aangeroepen, zelfs als de pointer verwijst naar het object van de klasse Cats .

Dit komt door Early Binding. We weten dat ‘a’ een pointer is van de bovenliggende klasse die verwijst naar het object van de onderliggende klasse. Omdat vroege binding plaatsvindt tijdens het compileren, dus als de compiler zag dat 'a' een pointer is van de bovenliggende klasse, koppelde deze de aanroep aan de functie 'sound ()' van de bovenliggende klasse zonder naar object te zoeken, de pointer het verwijst naar.

Verderop met dit artikel over virtuele functie in C ++

Late binding

Bij late binding identificeert de compiler het object tijdens runtime en vergelijkt vervolgens de functieaanroep met de juiste functie. Het staat ook bekend als Dynamic Binding of Runtime Binding.

Late binding in het bovenstaande probleem kan worden opgelost door een virtueel sleutelwoord in de basisklasse te gebruiken. Laten we eens kijken hoe dit gebeurt door het bovenstaande voorbeeld zelf te gebruiken, maar alleen een virtueel zoekwoord toe te voegen.

Voorbeeld

# inclusief het gebruik van de naamruimte std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <sound () return 0}

Uitvoer

Uitleg
Hier wordt de functie sound () van de basisklasse virtueel gemaakt, dus de compiler voert nu late binding uit voor deze functie. Nu wordt de functieaanroep van de functie sound () tijdens runtime aangepast aan de functiedefinitie. Aangezien de compiler pointer ‘a’ nu identificeert als verwijzend naar het object ‘c’ van de afgeleide klasse Cats, zal het de functie sound () van de klasse Cats aanroepen.

java hoe je dit kunt gebruiken

Verderop met dit artikel over virtuele functie in C ++

Pure virtuele functie

Een puur virtuele functie in C ++ is een virtuele functie waarvoor we geen implementatie hebben, we declareren deze alleen. Een puur virtuele functie wordt gedeclareerd door 0 toe te kennen in de declaratie.

virtueel leegte geluid () = 0

Hier is sound () een pure virtuele functie.

Verderop met dit artikel over virtuele functie in C ++

Abstracte klasse

Een abstracte klasse wordt gedefinieerd als een klasse met een of meer puur virtuele functies. Zoals hierboven uitgelegd, is puur virtuele functie een virtuele lidfunctie die is gemarkeerd als geen implementatie. Het heeft geen implementatie mogelijk met de informatie die in de klas wordt verstrekt, inclusief eventuele basisklassen. Een abstracte klasse wordt ook wel een abstracte basisklasse genoemd.

Voorbeeld

#inclusief het gebruik van naamruimte std class Employee // abstracte basisklasse {virtual int getSalary () = 0 // pure virtuele functie} class Employee_1: public Employee {int salaris public: Employee_1 (int s) {salaris = s} int getSalary () {retour salaris}} klasse Employee_2: public Employee {int salaris public: Employee_2 (int t) {salaris = t} int getSalary () {retour salaris}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Uitvoer

Uitleg
De functie ‘getSalary ()’ in de klasse Medewerker is een pure virtuele functie. Omdat de klasse Employee de pure virtuele functie bevat, is het daarom een ​​abstracte basisklasse.
Omdat de puur virtuele functie is gedefinieerd in de subklassen, wordt daarom de functie ‘getSalary ()’ gedefinieerd in beide subklassen van de klasse Employee, d.w.z. in Employee_1 en Employee_2.

Verderop met dit artikel over virtuele functie in C ++

Voorbeeld voor virtuele functie

#inclusief het gebruik van de naamruimte std class base {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout functie_2 () ptr-> functie_3 () ptr-> functie_4 ()}

Uitvoer

Uitleg
Voor function_1 () functieaanroep wordt de basisklasse-versie van de functie aangeroepen, function_2 () wordt overschreven in de afgeleide klasse, dus de afgeleide klasse-versie wordt aangeroepen, function_3 () wordt niet overschreven in de afgeleide klasse en is een virtuele functie, dus de basisklasse-versie wordt aangeroepen, op dezelfde manier wordt function_4 () niet overschreven, dus de basisklasse-versie wordt aangeroepen.

Hiermee zijn we aan het einde gekomen van dit artikel over ‘Virtuele functie in C ++’. Als je meer wilt weten, bekijk dan de door Edureka, een vertrouwd online leerbedrijf. Edureka's Java J2EE- en SOA-trainings- en certificeringscursus is ontworpen om u te trainen in zowel kern- als geavanceerde Java-concepten, samen met verschillende Java-frameworks zoals Hibernate & Spring.

hoe je een singleton class maakt in java

Heeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte van deze blog en we nemen zo snel mogelijk contact met je op.