Atšķirība starp virtuālo un tīro virtuālo funkciju

Autors: Laura McKinney
Radīšanas Datums: 2 Aprīlis 2021
Atjaunināšanas Datums: 13 Maijs 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

Saturs


Gan virtuālā funkcija, gan tīrā virtuālā funkcija ir izpildes laika polimorfisma jēdzieni. Galvenā atšķirība starp “virtuālā funkcija ” un 'Tīri virtuāla funkcija' ir tas, ka “virtuālajai funkcijai” ir sava definīcija pamatklasē, un arī mantotās atvasinātās klases to definē atkārtoti. Tīrai virtuālajai funkcijai pamata klasē nav definīcijas, un visām mantotajām atvasinātajām klasēm tā ir jādefinē no jauna.

Tomēr virtuālo funkciju sauc arī par dinamisko nosūtīšanu un izpildes laika nosūtīšanu, jo izsauktā funkcija tiek norādīta izpildes laikā atbilstoši izmantotā objekta tipam.

Polimorfismu atbalsta gan valodas C ++, gan Java. Java valodā “virtuālās funkcijas” vietā tiek izmantots termins “pārsvarā”, jo virtuālā funkcija ir C ++ termins.

  1. Salīdzināšanas tabula
  2. Definīcija
  3. Galvenās atšķirības
  4. Secinājums

Salīdzināšanas tabula

Salīdzināšanas pamatsVirtuālā funkcijaTīrā virtuālā funkcija
PamataVirtuālajai funkcijai ir sava definīcija pamatklasē.Tīrai virtuālajai funkcijai pamata klasē nav definīcijas.
Deklarācijavirtuālais funct_name (parametra_saraksts) {. . . . .};virtuālais funct_name (parametra_saraksts) = 0;
Atvasināta klaseVisas atvasinātās klases var vai nevar būt svarīgākas par bāzes klases virtuālo funkciju.Visām atvasinātajām klasēm ir jāpārspēj bāzes klases virtuālā funkcija.
Efekts

Virtuālās funkcijas ir hierarhiskas; tas neietekmē kompilāciju, ja atvasinātās klases nepārspēj bāzes klases virtuālo funkciju.Ja visas atvasinātās klases nespēj ignorēt bāzes klases virtuālo funkciju, rodas kompilācijas kļūda.
Abstraktā klaseNav koncepcijas.Ja klasē ir vismaz viena tīra virtuālā funkcija, tad tā tiek pasludināta par abstraktu.


Virtuālās funkcijas definīcija

virtuālā funkcija ir pamatklases dalībnieka funkcija, un to no jauna nosaka atvasinātās klases, kas manto pamatklases. Nav nepieciešams, lai visām mantotajām atvasinātajām klasēm būtu jādefinē virtuālā funkcija, to nosaka tikai tās atvasinātās klases, kurām var būt nepieciešama tās darbība. Virtuālo funkciju izveido, deklarējot funkciju bāzes klasē, kurai seko atslēgas vārds 'Virtuāls'.

Deklarācija:

klases bāze {public: virtuālais tips funt_name (parametru saraksts) {. . . }};

Mantotās atvasinātās klases var no jauna noteikt virtuālo funkciju bez “virtuāla” atslēgvārda. Atvasinātās klases no jauna definē virtuālo funkciju, lai izpildītu tās uzdevumu. Tā kā virtuālā funkcija tiek atkārtoti definēta atvasinātās klasēs, mums ir vairākas vienas un tās pašas funkcijas formas. Tagad, kura funkcijas versija tiek izsaukta, ir atkarīgs no tā, uz kādu objektu tiek atsaukta šī funkcija.


Daudzlīmeņu mantojums

Daudzlīmeņu mantojumā, kad atvasināta klase, kas ir mantojusi virtuālo funkciju no savas bāzes klases, kad pati tiek izmantota kā bāzes klase citai atvasinātai klasei, virtuālo funkciju joprojām var ignorēt. Tātad, kad tiek mantota virtuālā funkcija, tiek mantota arī tās virtuālā daba.

Virtuālajām funkcijām ir arī hierarhijas raksturs, t.i., ja atvasinātā klase nepārspēj / nenosaka no bāzes klases mantoto virtuālo funkciju un ja atvasinātās klases objekts izsauc šo virtuālo funkciju, tad tiek izsaukta pamatklase noteiktā virtuālā funkcija.

Tīras virtuālās funkcijas definīcija

Kā redzams iepriekš, ja atvasinātā klase nepārspēj virtuālo funkciju, tiek izmantota pamatklase noteiktā virtuālā funkcija. Kā būtu, ja pati pamatklase nenosaka virtuālo funkciju. Daudzas reizes bāzes klasē nav definētas virtuālās funkcijas, vai dažreiz jūs vēlaties, lai visām atvasinātajām klasēm būtu augstāka nekā virtuālā funkcija.

Lai apstrādātu abas iepriekš minētās situācijas, C ++ atbalsta jēdzienu “Tīrā virtuālā funkcija“. Pamata klasē tiek deklarēta “tīra virtuālā funkcija”, bet pamatklasē tai nav definīcijas. Tīri virtuālo funkciju deklarē šādi.

virtuālais tips funct_name (parametra_saraksts) = 0;

Ja virtuālā funkcija pamatklasē tiek padarīta par “tīru”, tad katrai atvasinātajai klasei obligāti jāpārskata pamatklases tīrā virtuālā funkcija. Ja atvasinātā klase nespēj ignorēt bāzes klases tīro virtuālo funkciju, tā radīs kompilācijas kļūdu.

Abstraktā klase

Klasi, kurā ir vismaz viena tīra funkcija, sauc par “abstrakto klasi”. Nevar izveidot abstraktu klašu objektus, bet jūs varat izveidot atsauces un norādes uz abstraktajām klasēm. Abstrakto klašu dalībniekiem var piekļūt, izmantojot atvasināto klašu objektu, kas manto abstrakto pamatklases.

Klase, kuru vēlaties pasludināt par abstraktu, izmantojiet atslēgvārdu 'Abstrakts' priekšā 'Klase' atslēgvārds.

// piemēram, abstrakts klases klases nosaukums {. . virtuālais tips funct_name (parametra_saraksts) = 0; . . };

  1. Virtuālās funkcijas ir noteikti definētas pamatklasē un atkārtoti definētas (ignorētas) atvasinātajā klasē. No otras puses, tīrā virtuālā funkcijā bāzes klase pamatklasē īpaši nav definēta
  2. Atvasinātā klase vajadzības gadījumā atkārtoti definē (ignorē) virtuālo funkciju, turpretī tīras virtuālās funkcijas gadījumā klasei noteikti jāpārdefinē tīrā virtuālā funkcija.
  3. Ja atvasinātajai klasei neizdodas no jauna definēt (ignorēt) virtuālo funkciju, tā var izmantot bāzes klases virtuālo funkciju. Un otrādi, ja atvasinātai klasei nav iespējams ignorēt tīru virtuālo funkciju, rodas kompilācijas kļūda.
  4. Bāzes klase, kas satur virtuālo funkciju, var tikt aktualizēta, t.i., var izveidot tās objektu. Pretstatā tam, bāzes klase, kas satur tīru virtuālo funkciju, t.i., abstraktu klasi nevar aktualizēt, jo abstraktā klase nav pilnībā definēta.

Piezīme:
“Virtuālās funkcijas” un “tīras virtuālās funkcijas” prototips visā programmā paliek tas pats.

Secinājums:

Gan “virtuālajām funkcijām”, gan “tīrai virtuālajai funkcijai” ir sava nozīme, jo “virtuālajās funkcijās” visām atvasinātajām klasēm nav jāpārdefinē virtuālā funkcija, un kur mēs vēlamies, lai visām atvasinātajām klasēm būtu jādefinē virtuālā funkcija, tīri virtuālā funkcija tur vislabāk piemērojama.