Rozdiel medzi virtuálnou a čistou virtuálnou funkciou

Autor: Laura McKinney
Dátum Stvorenia: 2 Apríl 2021
Dátum Aktualizácie: 13 Smieť 2024
Anonim
Rozdiel medzi virtuálnou a čistou virtuálnou funkciou - Technológie
Rozdiel medzi virtuálnou a čistou virtuálnou funkciou - Technológie

Obsah


Virtuálna funkcia aj čisto virtuálna funkcia sú koncepty polymorfizmu runtime. Hlavný rozdiel medzi ‘virtuálna funkcia ' a „Čistá virtuálna funkcia“ je to, že „virtuálna funkcia“ má svoju definíciu v základnej triede a tiež zdedené odvodené triedy ju predefinujú. Čistá virtuálna funkcia nemá v základnej triede definíciu a všetky dedičné odvodené triedy ju musia nanovo definovať.

Virtuálna funkcia sa však nazýva aj ako dynamické odosielanie a odoslanie za behu, pretože volanie funkcie sa v čase spustenia špecifikuje podľa typu použitého objektu.

Polymorfizmus podporujú jazyky C ++ aj Java. V jazyku Java sa namiesto výrazu „virtuálna funkcia“ používa výraz „overriding“, keďže virtuálna funkcia sa nazýva C ++.

  1. Porovnávacia tabuľka
  2. definícia
  3. Kľúčové rozdiely
  4. záver

Porovnávacia tabuľka

Základ pre porovnanieVirtuálna funkciaČistá virtuálna funkcia
základnéVirtuálna funkcia má svoju definíciu v základnej triede.Čistá virtuálna funkcia nemá v základnej triede definíciu.
vyhlásenievirtual funct_name (parameter_list) {. , , , .};názov virtuálneho funct_name (parameter_list) = 0;
Odvodená triedaVšetky odvodené triedy môžu alebo nemusia prepísať virtuálnu funkciu základnej triedy.Všetky odvodené triedy musia prepísať virtuálnu funkciu základnej triedy.
účinok

Virtuálne funkcie sú svojou povahou hierarchické; neovplyvní kompiláciu, ak odvodené triedy neprepíšu virtuálnu funkciu základnej triedy.Ak všetky odvodené triedy neprepíšu virtuálnu funkciu základnej triedy, dôjde k chybe kompilácie.
Abstraktná triedaŽiadny koncept.Ak trieda obsahuje aspoň jednu čistú virtuálnu funkciu, potom sa vyhlási za abstraktnú.


Definícia virtuálnej funkcie

virtuálna funkcia je členská funkcia základnej triedy a je definovaná odvodenými triedami, ktoré zdedia základnú triedu. Nie je potrebné, aby všetky dedičné odvodené triedy museli nanovo definovať virtuálnu funkciu, je definovaná iba tými odvodenými triedami, ktoré môžu vyžadovať jej fungovanie. Virtuálna funkcia sa vytvorí vyhlásením funkcie v základnej triede, ktorej predchádza kľúčové slovo , Virtuálne '.

Vyhlásenie:

class base {public: virtual type funt_name (parameter-list) {. , , }};

Zdedené odvodené triedy môžu predefinovať virtuálnu funkciu bez akéhokoľvek kľúčového slova „virtuálny“. Odvodené triedy predefinujú virtuálnu funkciu na splnenie jej úlohy. Pretože virtuálna funkcia je predefinovaná v odvodených triedach, máme viacero foriem rovnakej funkcie. Teraz, ktorá verzia funkcie sa volá, závisí od toho, aký druh objektu sa má na túto funkciu vyvolať.


Viacúrovňové dedičstvo

Vo viacúrovňovom dedičstve, keď je odvodená trieda, ktorá zdedila virtuálnu funkciu od svojej základnej triedy, aj keď sa sama používa ako základná trieda pre inú odvodenú triedu, virtuálnu funkciu možno stále prepísať. Takže, keď sa zdedí virtuálna funkcia, zdedí sa aj jej virtuálna povaha.

Virtuálne funkcie sú tiež svojou povahou hierarchické, t.j. ak odvodená trieda neprepíše / nadefinuje virtuálnu funkciu zdedenú zo základnej triedy a keď objekt odvodenej triedy vyvolá túto virtuálnu funkciu, vyvolá sa virtuálna funkcia definovaná základnou triedou.

Definícia čistej virtuálnej funkcie

Ako je vidieť vyššie, ak odvodená trieda nenahradí virtuálnu funkciu, potom sa použije virtuálna funkcia definovaná základnou triedou. Čo ak však samotná základná trieda nedefinuje virtuálnu funkciu. Základná trieda mnohokrát nemá definíciu virtuálnej funkcie alebo niekedy chcete, aby všetky odvodené triedy museli virtuálnu funkciu prepísať.

Na zvládnutie týchto dvoch situácií podporuje C ++ koncept „Čistá virtuálna funkcia". „Čistá virtuálna funkcia“ je deklarovaná v základnej triede, ale nemá definíciu v základnej triede. Čistá virtuálna funkcia sa deklaruje nasledovne.

virtuálny typ funct_name (parameter_list) = 0;

Vždy, keď sa virtuálna funkcia v základnej triede stane „čistou“, potom každá odvodená trieda musí povinne prepísať čistú virtuálnu funkciu základnej triedy. Ak odvodená trieda neprepíše čisto virtuálnu funkciu základnej triedy, bude mať za následok chybu kompilácie.

Abstraktná trieda

Trieda, ktorá obsahuje aspoň jednu čistú funkciu, sa nazýva „abstraktná trieda“. Nie je možné vytvárať žiadne objekty abstraktných tried, ale môžete vytvárať odkazy a ukazovatele na abstraktné triedy. Členovia abstraktných tried sú prístupní cez objekt odvodených tried, ktorý zdedí abstraktnú základnú triedu.

Trieda, ktorú chcete deklarovať ako abstrakt, použite kľúčové slovo , Abstraktné ' pred 'trieda' kľúčových slov.

// napríklad abstraktné meno triedy triedy {. , virtuálny typ funct_name (parameter_list) = 0; , , };

  1. Virtuálne funkcie sú určite definované v základnej triede a predefinované (nahradené) v odvodenej triede. Na druhej strane čistá virtuálna funkcia, ktorú základná trieda konkrétne nie je definovaná v základnej triede
  2. Odvodená trieda v prípade potreby predefinuje (prepíše) virtuálnu funkciu, zatiaľ čo v prípade čistej virtuálnej funkcie musí odvodená trieda definitívne definovať čistú virtuálnu funkciu.
  3. Ak odvodená trieda nedokáže predefinovať (prepísať) virtuálnu funkciu, môže použiť virtuálnu funkciu základnej triedy. Naopak, ak odvodená trieda neprepíše čistú virtuálnu funkciu, potom nastane chyba kompilácie.
  4. Môže sa vytvoriť inštancia základnej triedy obsahujúcej virtuálnu funkciu, t. J. Môže sa vytvoriť jej objekt. Naproti tomu základná trieda obsahujúca čisto virtuálnu funkciu, t. J. Abstraktnú triedu, nemôže byť vytvorená inštanciou, pretože abstraktná trieda nie je úplne definovaná.

Poznámka:
Prototyp „virtuálnej funkcie“ a „čistej virtuálnej funkcie“ zostáva v celom programe rovnaký.

záver:

„Virtuálne funkcie“ aj „čisto virtuálne funkcie“ majú svoj význam, ako v prípade „virtuálnych funkcií“, všetky odvodené triedy nemusia predefinovať virtuálnu funkciu a tam, kde chceme, aby všetky odvodené triedy predefinovali virtuálnu funkciu, čisto virtuálne tu funguje najlepšie.