C++ virtuālais konstruktors

C Virtualais Konstruktors



C++ neveicina virtuālo konstruktoru konstruēšanu, jo nav iespējams ignorēt klases konstruktoru. Tātad konstruktora virtualizācijai nav nozīmes. Nav koncepcijas par virtuālā konstruktora izveidi C++ programmā, taču mēs varam tur izveidot virtuālo destruktoru. Mēs to varam arī definēt, jo konstruktora programmēšanu programmā C++ nevar uzskatīt par virtuālu, jo, kad tiek izsaukts klases konstruktors, atmiņā nav virtuālās tabulas, kas norāda, ka nav izveidots virtuālais rādītājs. Tādējādi konstruktoram vienmēr jābūt nevirtuālam.

Tomēr virtuāls iznīcinātājs varētu pastāvēt. Šeit mēs parādīsim, kas notiek, kad mēs izveidojam virtuālo konstruktoru programmā C++, kā arī virtuālā konstruktora darbību, nevis virtuālo konstruktoru.

1. piemērs:

Izveidosim virtuālo konstruktoru un sāksim kodu, ievietojot “iostream” galvenes failu. Šis galvenes fails ir paredzēts funkcijām, kas tajā ir deklarētas, piemēram, “cin” un “cout”. Pēc tam mēs pievienojam 'std' nosaukumvietu, tāpēc mēs nevaram pievienot šo 'std' ar katru mūsu koda funkciju. Pēc tam mēs izveidojam klasi, kas ir mūsu koda bāzes klase ar nosaukumu “my_base”, un pēc tam pievienojam “public”, lai izveidotu virtuālo konstruktoru.







Šeit tiek izveidots virtuālais konstruktors, ievietojot atslēgvārdu “virtuāls”. Šajā virtuālajā konstruktorā mēs ievietojam paziņojumu “cout”. Zem tā mēs izveidojam funkciju ar nosaukumu “show”, kurā atkal izmantojam “cout”. Pēc tam mēs izveidojam šīs bāzes klases atvasinātu klasi ar nosaukumu “my_derived” un pēc tam laukā “publiskais” izveidojam konstruktoru “my_derived()”. Mēs ievietojam paziņojumu “cout” šajā konstruktorā “my_derived()”. Zem tā mēs izveidojam funkciju, ko sauc par “show”, kur mēs vēlreiz izmantojam “cout”.



Tagad, pēc “main()” izsaukšanas, mēs izveidojam bāzes klases rādītāju ar nosaukumu “my_ptr”, kā arī izveidojam atvasinātās klases objektu, kas ir “Obj_d”. Pēc tam mēs piešķiram “Obj_d” adresi “my_ptr”. Pēc tam mēs izsaucam funkciju “show()”, izmantojot “my_ptr”.



1. kods:





#include
izmantojot nosaukumvieta std ;
klasē mana_bāze
{
publiski :
virtuāls mana_bāze ( )
{
cout << 'Šeit ir mana bāzes klase' << endl ;
}
nederīgs parādīt ( )
{
cout << 'bāzes klases parādīšanas funkcija' << endl ;
}
} ;
klasē mans_atvasināts : publiski mana_bāze
{
publiski :
mans_atvasināts ( )
{
cout << 'Šeit ir mana atvasinātā klase' << endl ;
}
nederīgs parādīt ( )
{
cout << 'atvasinātās klases parādīšanas funkcija' < parādīt ( ) ;
}

Izvade:
Šeit tiek parādīts kļūdas ziņojums, kurā teikts, ka konstruktoru nevar pasludināt par virtuālu C++ programmā. Tātad, mēs varam redzēt, ka C++ neļauj mums ģenerēt virtuālo konstruktoru, bet mēs varam izveidot virtuālo iznīcinātāju.



2. piemērs:

Atrisināsim iepriekšējo problēmu un šajā kodā izveidosim virtuālo iznīcinātāju. Pēc klases “new_base” deklarēšanas mēs ievietojam “publisko” konstruktoru, kurā izveidojam virtuālo iznīcinātāju, pievienojot “virtual ~” ar “new_base”. Šajā virtuālajā iznīcinātājā mēs ievietojam paziņojumu “cout”. Zem tā mēs izveidojam funkciju, ko sauc par “show”, kas izmanto “cout”. Pēc tam mēs izveidojam atvasinātu klasi, kas ir “new_derived” no šīs “new_base” bāzes klases, un laukā “public” izveidojam “new_derived()” iznīcinātāju. Šim “new_derived()” iznīcinātājam tagad ir pievienots paziņojums “cout”.

Zem tā mēs izveidojam funkciju ar nosaukumu “show”, kas atkal izmanto paziņojumu “cout”. Pēc funkcijas “main()” izsaukšanas mēs tagad izveidojam objektu no “obj_d” atvasinātās klases, kā arī bāzes klases rādītāju ar nosaukumu “ptr1”. Pēc tam mēs piešķiram “obj_d” adresi “ptr1”. Pēc tam tiek izsaukta metode “show()”, izmantojot “ptr1”.

2. kods:

#include
izmantojot nosaukumvieta std ;
klasē new_base
{
publiski :
virtuāls ~jauna_bāze ( )
{
cout << 'Bāzes klases iznīcinātājs ir klāt' << endl ;
}
nederīgs parādīt ( )
{
cout << 'Pamatklases šova funkcija' << endl ;
}
} ;
klasē jauns_atvasināts : publiski new_base
{
publiski :
~jauns_atvasināts ( )
{
cout << 'Atvasinātais klases iznīcinātājs ir klāt' << endl ;
}
nederīgs parādīt ( )
{
cout << 'Pamatklases šova funkcija' < parādīt ( ) ;
}

Izvade:
Šī programma izmanto “new_base” rādītāja objektu, kas norāda uz “obj_d” atvasināto klasi. Tādējādi tas vispirms izsauc klases “new_base” metodi “show()”. Pēc tam tas izsauc klases “new_derived” metodi “~new_derived()” un parāda bāzes klases “~new_base”.

3. piemērs:

Šeit ir vēl viens kods “virtuālā” konstruktora ģenerēšanai. Pēc “iostream” un “std” nosaukumvietas iekļaušanas mēs ģenerējam klasi “B”. Zem tā mēs izveidojam “publisko” konstruktoru, kas ir “B()”, un pēc tam ģenerējam “cout”. Konstruktora un destruktora funkcijas tiek definētas, izmantojot “publisku” piekļuves specifikāciju, kurā var izsaukt jebkuru klases objektu.

Tagad mēs arī izveidojam šīs bāzes klases “~B()” iznīcinātāju, kurā atkal izmantojam “cout”. Pēc tam mēs izveidojam “D” klasi, kas ir atvasināta no “B” bāzes klases, un ievietojam šeit “publisko”. Šajā “publiskajā” mēs izveidojam konstruktoru, kā arī atvasinātās klases iznīcinātāju ar attiecīgi nosaukumiem “D()” un “~D”. Abi satur “cout” to iekšienē. Tagad mums ir funkcija “main ()”. Pēc šīs funkcijas izsaukšanas mēs ģenerējam bāzes klases rādītāja objektu.

Pēc tam mēs izmantojam atslēgvārdu “delete” un šeit ievietojam “base_ptr”. Šajā gadījumā destruktora vieta tiek izdzēsta, izsaucot bāzes klases rādītāja objektu.

3. kods:

#include
izmantojot nosaukumvieta std ;
klasē B
{
publiski :
B ( )
{
cout << 'Bāzes klases konstruktors' << endl ;
}
~B ( )
{
cout << 'Bāzes klases iznīcinātājs' << endl ;
}
} ;

klasē D : publiski B
{
publiski :
D ( )
{
cout << 'Atvasinātās klases konstruktors' << endl ;
}
~D ( )
{
cout << 'Atvasinātās klases iznīcinātājs' << endl ;
}
} ;
starpt galvenais ( )
{
B * base_ptr = jauns D ;
dzēst base_ptr ;
}

Izvade:
Rezultāts parāda, ka tas izmanto rādītāja objektu, kas norāda uz 'B' klasi galvenajā funkcijā. Tādējādi tas vispirms izsauc “B” klases “konstruktoru ()”. Pēc tam tas izsauc 'D' klases 'konstruktoru ()'. Pēc tam tiek dzēsts rādītāja objekts, kas atrodas “B” un “D” klases iznīcinātājiem. Programmā neizsaucot “D” klases iznīcinātāju, “B” klases rādītājs tikai novērš “B” klases iznīcinātāju. Tā rezultātā tiek bojāta programmas atmiņa.

Secinājums

Mēs apspriedām jēdzienu “Virtuālā konstrukcija” C++ programmēšanā. Mēs izpētījām, ka nevaram izveidot virtuālo konstruktoru programmā C++, taču mēs varam izveidot virtuālo destruktoru savos kodos. Šeit mēs parādījām, kas notika, veidojot virtuālo konstruktoru C++ programmēšanā un virtuālā destruktora darbību mūsu kodos. Mēs uzzinājām, ka konstruktors nevar būt virtuāls, bet mēs varam ģenerēt virtuālo destruktoru savā klasē. Šajā rokasgrāmatā mēs demonstrējām dažus piemērus un rūpīgi izskaidrojām šos kodus.