Skillnaden mellan virtuell och ren virtuell funktion

Författare: Laura McKinney
Skapelsedatum: 2 April 2021
Uppdatera Datum: 4 Maj 2024
Anonim
Relationship between Virtual Functions, Pure Virtual Functions and Abstract Classes in OOP explained
Video: Relationship between Virtual Functions, Pure Virtual Functions and Abstract Classes in OOP explained

Innehåll


Den virtuella funktionen och den rena virtuella funktionen är båda begreppen körtidspolymorfism. Den största skillnaden mellan "virtuell funktion ' och "Ren virtuell funktion" är att "virtuell funktion" har sin definition i basklassen och även de arvtagna härledda klasserna omdefinierar den. Den rena virtuella funktionen har ingen definition i basklassen, och alla de ärva härledda klasserna måste omdefiniera den.

Emellertid kallas den virtuella funktionen också som dynamisk avsändning och körtidssändning, på grund av att den anropade funktionen anges i körtiden i enlighet med typen av objekt som används.

Polymorfism stöds av både språken C ++ och Java. I Java används termen "åsidosättande" i stället för "virtuell funktion", eftersom den virtuella funktionen är termen C ++.


  1. Jämförelsediagram
  2. Definition
  3. Viktiga skillnader
  4. Slutsats

Jämförelsediagram

Grund för jämförelseVirtuell funktionRen virtuell funktion
GrundläggandeVirtuell funktion har sin definition i basklassen.Pure Virtual Function har ingen definition i basklassen.
Deklarationvirtual function_name (parameter_list) {. . . . .};virtuellt funktionsnamn (parameter_list) = 0;
Deriverad klassAlla härledda klasser kan eller inte kan åsidosätta basklassen virtuella funktion.Alla härledda klasser måste åsidosätta basklassen virtuella funktion.
Effekt

Virtuella funktioner är hierarkiska till sin natur; det påverkar inte sammanställningen om några härledda klasser inte åsidosätter basklassen virtuella funktion.Om alla härledda klasser inte åsidosätter basklassen virtuella funktion kommer kompilationsfelet att inträffa.
Abstrakt klassInget koncept.Om en klass innehåller minst en ren virtuell funktion förklaras den abstrakt.


Definition av virtuell funktion

De virtuell funktion är basfunktionens medlemsfunktion, och den definieras om av de härledda klasserna som ärver basklassen. Det är inte nödvändigt att alla ärva härledda klasser måste omdefiniera den virtuella funktionen, den definieras endast av de härledda klasser som kan kräva dess funktion. En virtuell funktion skapas genom att deklarera funktionen i basklassen föregående med nyckelordet 'virtuell'.

Deklaration :

klassbas {public: virtualtyp funt_name (parameterlista) {. . . }};

De ärva härledda klasserna kan omdefiniera den virtuella funktionen utan något "virtuellt" sökord. Deriverade klasser omdefinierar den virtuella funktionen för att utföra sin uppgift. Eftersom den virtuella funktionen omdefinieras i härledda klasser har vi flera former av samma funktion. Vilken version av funktionen kallas beror nu på vilken typ av objekt som hänvisas till för att åberopa den funktionen.

Multilevel arv

I arv i flera nivåer, där en härledd klass som har ärvt den virtuella funktionen från sin basklass, när den själv används som en basklass för en annan härledd klass, kan den virtuella funktionen fortfarande åsidosättas. Så när en virtuell funktion ärvs ärvs dess virtuella natur också.

Virtuella funktioner är också hierarkiska till sin natur, dvs om en härledd klass inte åsidosätter / omdefinierar den virtuella funktionen som ärvs från basklassen och när härledd klassens objekt åberopar den virtuella funktionen, åberopas den virtuella funktionen som definieras av basklassen.

Definition av ren virtuell funktion

Som ses ovan om härledd klass inte åsidosätter den virtuella funktionen används den virtuella funktionen som definieras av basklassen. Men vad händer om basklassen inte definierar den virtuella funktionen. Många gånger har basklassen ingen definition för den virtuella funktionen, eller ibland vill du att alla härledda klasser måste åsidosätta den virtuella funktionen.

För att hantera dessa två situationer ovan stöder C ++ konceptet "Ren virtuell funktion”. En 'ren virtuell funktion' deklareras i basklassen men har inte sin definition i basklassen. Den rena virtuella funktionen deklareras enligt följande.

virtuell typ funct_name (parameter_list) = 0;

Närhelst en virtuell funktion i basklassen görs "ren", måste varje härledd klass obligatoriskt åsidosätta basklasens rena virtuella funktion. Om den härledda klassen inte åsidosätter basklassen rena virtuella funktioner kommer det att resultera i kompilationsfel.

Abstrakt klass

Klassen som innehåller minst en ren funktion kallas 'abstrakt klass'. Inga objekt för abstrakta klasser kan skapas, men du kan skapa referenser och pekare på abstrakta klasser. Medlemmar i abstrakta klasser kan nås via objektet för de härledda klasserna som ärver den abstrakta basklassen.

Använd en nyckelord som du vill förklara abstrakt 'abstrakt' framför 'klass' nyckelord.

// till exempel abstrakt klassklassnamn {. . virtuell typ funct_name (parameter_list) = 0; . . };

  1. Virtuella funktioner definieras definitivt i basklassen och omdefinieras (åsidosätter) i den härledda klassen. Å andra sidan är ren virtuell funktion basklassen särskilt inte definierad i basklassen
  2. Deriverad klass om nödvändigt omdefiniera (åsidosätta) den virtuella funktionen, medan, i fall av ren virtuell funktion, måste härledd klass definitivt omdefiniera den rena virtuella funktionen.
  3. Om den härledda klassen misslyckas med att omdefiniera (åsidosätta) den virtuella funktionen kan den använda den virtuella funktionen för basklassen. Omvänt, om en härledd klass inte åsidosätter ren virtuell funktion uppstår kompilationsfel.
  4. Basklass som innehåller den virtuella funktionen kan instanseras, dvs dess objekt kan skapas. I motsats till detta kan basklassen som innehåller ren virtuell funktion, dvs en abstrakt klass inte instanseras eftersom en abstrakt klass inte är helt definierad.

Notera:
Prototypen för 'virtuell funktion' och 'ren virtuell funktion' förblir densamma i hela programmet.

Slutsats:

De "virtuella funktionerna" och "ren virtuell funktion" har båda sin betydelse, som i "virtuella funktioner" behöver inte alla härledda klasser omdefiniera den virtuella funktionen och där vi vill att all härledd klass ska omdefiniera den virtuella funktionen, ren virtuell funktion funktion gäller bäst där.