Atšķirība starp virtuālo un tīro virtuālo funkciju
Saturs
- Salīdzināšanas tabula
- Virtuālās funkcijas definīcija
- Deklarācija:
- Daudzlīmeņu mantojums
- Tīras virtuālās funkcijas definīcija
- Abstraktā klase
- Secinājums:
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.
- Salīdzināšanas tabula
- Definīcija
- Galvenās atšķirības
- Secinājums
Salīdzināšanas tabula
Salīdzināšanas pamats | Virtuālā funkcija | Tīrā virtuālā funkcija |
---|---|---|
Pamata | Virtuālajai funkcijai ir sava definīcija pamatklasē. | Tīrai virtuālajai funkcijai pamata klasē nav definīcijas. |
Deklarācija | virtuālais funct_name (parametra_saraksts) {. . . . .}; | virtuālais funct_name (parametra_saraksts) = 0; |
Atvasināta klase | Visas 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ā klase | Nav 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; . . };
- 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
- 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.
- 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.
- 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.