Diferența dintre funcția virtuală și cea virtuală

Autor: Laura McKinney
Data Creației: 2 Aprilie 2021
Data Actualizării: 12 Mai 2024
Anonim
Lecția 3, Modul 2 Diferența dintre lumea reală și cea virtuală
Video: Lecția 3, Modul 2 Diferența dintre lumea reală și cea virtuală

Conţinut


Funcția virtuală și funcția virtuală pură sunt ambele concepte ale polimorfismului în timp de rulare. Principala diferență între „funcție virtuală ” și „Funcție virtuală pură” este faptul că „funcția virtuală” își are definiția în clasa de bază și, de asemenea, o redefinește clasele derivate moștenitoare. Funcția virtuală pură nu are nicio definiție în clasa de bază și toate clasele derivate moștenitoare trebuie să o redefinească.

Cu toate acestea, funcția virtuală se mai numește și ca expediere dinamică și expediere în timp de rulare, datorită funcției numite este specificată în timpul de execuție, în conformitate cu tipul obiectului utilizat.

Polimorfismul este susținut atât de limbile C ++ cât și de Java. În Java, termenul „suprapunere” este utilizat în loc de „funcție virtuală”, deoarece funcția virtuală este termenul de C ++.

  1. Diagramă de comparație
  2. Definiție
  3. Diferențele cheie
  4. Concluzie

Diagramă de comparație

Baza pentru comparațieFuncție virtualăFuncție virtuală pură
De bazăFuncția virtuală are definiția lor în clasa de bază.Funcția virtuală pură nu are nicio definiție în clasa de bază.
Declaraţienume funcțional virtual (parametru_list) {. . . . .};nume funcțional virtual (parametru_list) = 0;
Clasa derivatăToate clasele derivate pot sau nu să înlocuiască funcția virtuală a clasei de bază.Toate clasele derivate trebuie să înlocuiască funcția virtuală a clasei de bază.
Efect

Funcțiile virtuale au un caracter ierarhic; nu afectează compilarea dacă nici o clasă derivată nu trece peste funcția virtuală a clasei de bază.Dacă toate clasele derivate nu reușesc să înlocuiască funcția virtuală a clasei de bază, va apărea eroarea de compilare.
Clasă abstractăFără concept.Dacă o clasă conține cel puțin o funcție virtuală pură, atunci este declarată abstractă.


Definiția funcției virtuale

funcție virtuală este funcția de membru al clasei de bază și este redefinită de clasele derivate care moștenește clasa de bază. Nu este necesar ca toate clasele derivate moștenitoare să redefinească funcția virtuală, ea este redefinită doar de acele clase derivate care pot necesita funcționarea acesteia. O funcție virtuală este creată prin declararea funcției din clasa de bază precedată de cuvântul cheie 'virtual'.

Declarație:

class class {public: virtual type nume_funcie (listă parametri) {. . . }};

Moștenirea claselor derivate poate redefini funcția virtuală fără niciun cuvânt cheie „virtual”. Clasele derivate redefinesc funcția virtuală pentru a-și îndeplini sarcina. Deoarece funcția virtuală este redefinită în clase derivate, avem mai multe forme ale aceleiași funcții. Acum, ce versiune a funcției este apelată, depinde de la ce fel de obiect se face referire pentru a invoca această funcție.


Moștenire pe mai multe niveluri

În moștenire cu mai multe niveluri, unde o clasă derivată care a moștenit funcția virtuală de la clasa sa de bază, atunci când este folosită ca o clasă de bază pentru o altă clasă derivată, funcția virtuală poate fi totuși anulată. Deci, atunci când o moștenire a unei funcții virtuale natura sa virtuală este moștenită.

Funcțiile virtuale au, de asemenea, o natură ierarhică, adică dacă o clasă derivată nu anulează / redefinește funcția virtuală moștenită de la clasa de bază și când obiectul clasei derivate invocă acea funcție virtuală, atunci este invocată funcția virtuală definită de clasa de bază.

Definiția funcției virtuale pure

Așa cum s-a văzut mai sus, dacă clasa derivată nu trece peste funcția virtuală, atunci se utilizează funcția virtuală definită de clasa de bază. Dar, dacă clasa de bază în sine nu definește funcția virtuală. De multe ori, clasa de bază nu are nicio definiție pentru funcția virtuală sau, uneori, doriți ca toate clasele derivate să înlocuiască funcția virtuală.

Pentru a gestiona aceste două situații de mai sus, C ++ acceptă conceptul de „Funcție virtuală pură„. O „funcție virtuală pură” este declarată în clasa de bază, dar nu are definiția sa în clasa de bază. Funcția virtuală pură este declarată după cum urmează.

tip virtual func_name (parametru_list) = 0;

Ori de câte ori o funcție virtuală din clasa de bază este făcută „pură”, atunci fiecare clasă derivată trebuie să înlocuiască obligatoriu funcția virtuală pură a clasei de bază. Dacă clasa derivată nu reușește să înlocuiască funcția virtuală pură a clasei de bază, va rezulta o eroare de compilare.

Clasă abstractă

Clasa care conține cel puțin o funcție pură se numește „clasă abstractă”. Nu se pot crea obiecte din clase abstracte, dar puteți crea referințe și indicatoare la clase abstracte. Membrii claselor abstracte pot fi accesate prin obiectul claselor derivate care moștenește clasa de bază abstractă.

Utilizați cuvântul cheie o clasă pe care doriți să o declarați abstractă 'abstract' în fața 'clasă' cuvinte cheie.

// de exemplu, denumire de clasă abstractă {. . tip virtual func_name (parametru_list) = 0; . . };

  1. Funcțiile virtuale sunt definite cu siguranță în clasa de bază și redefinite (anulează) în clasa derivată. Pe de altă parte, funcția virtuală pură clasa de bază nu este definită în special în clasa de bază
  2. Clasa derivată, dacă este necesar, redefini (anulează) funcția virtuală, în timp ce, în cazul funcției virtuale pure, clasa derivată trebuie să redefinească cu siguranță funcția virtuală pură.
  3. Dacă clasa derivată nu reușește să redefinească (anulează) funcția virtuală, aceasta poate utiliza funcția virtuală a clasei de bază. În schimb, dacă o clasă derivată nu reușește să înlocuiască funcția virtuală pură atunci apare o eroare de compilare.
  4. Clasa de bază care conține funcția virtuală poate fi inițiată, adică obiectul său poate fi creat. Spre deosebire, clasa de bază care conține funcție virtuală pură, adică o clasă abstractă nu poate fi instantanată, deoarece o clasă abstractă nu este complet definită.

Notă:
Prototipul „funcției virtuale” și „funcției virtuale pure” rămâne același pe parcursul programului.

Concluzie:

„Funcțiile virtuale” și „funcția virtuală pură” au ambele importanță, întrucât în ​​„funcții virtuale”, toate clasele derivate nu trebuie să redefinească funcția virtuală și unde dorim ca toată clasa derivată să redefinească funcția virtuală, pur virtuală funcția se aplică cel mai bine acolo.