Тақырып 4 «Кластар мұрагерлігі. Көпше түрдегі мұрагерлік» Мақсаты



бет2/3
Дата08.02.2022
өлшемі90 Kb.
#120020
1   2   3
Байланысты:
Тема4-каз

§ 2 Туынды кластардың конструкторлары және деструкторлары

С++те базалық класс конструкторлары және деструкторлары туынды кластарға мұрагерленбейді. Бірақ туынды кластың өзінің конструкторы және деструкторы бола алады. Сондықтан мұрагерлік механизмін қолданған кезде базалық және туынды кластардың осы компоненттері арасындағы қатынасты анықтайтын ережелер қажет.


Туынды класс объектілерін хабарлау кезінде базалық класс конструкторы автоматты түрде шақырылады. Егер базалық класс конструкторының аргументтері бар болса, онда олардың мәндері туынды класс конструкторының қосымша аргументтері арқылы берілу керек. Бұл кезде базалық және туынды класс объектілерін құрастырудың қатаң реті сақталады: алдымен базалық класс объектісі және оның компоненттері хабарлау ретімен құрылады, содан соң туынды класс объектісі құрылады.


Мысал 4.3 Базалық және туынды кластар конструкторларының жұмыс жасау реті
#include
#include
class A
{int a;
public:
int c1;
void print(void) {cout<< a<<" "<A(int v):a(v){c1=10;}// A базалық класының конструкторы
};
class B: public A
{ int b;
public:
void print(void) {cout<< b<<" "<B(int va,int vb):A(va),b(vb){} // B туынды класының конструкторы
};
class C: public B
{ int c;
public:
void print(void) {cout<< c<<" "<C(int va, int vb, int vc):B(va,vb),c(vc){}// C класының конструкторы
};
void main()
{
clrscr();
A aa(5), *pa; // А класының конструкторы шақырылады
B bb(77,100); // А класының конструкторы, содан соң B класының конструкторы шақырылады
C cc(33,444,1000); // А, B, және C конструкторлары шақырылады
bb.c1=25; cc.c1=35;
cout<<"Жұмыс нәтижесі:"<< endl;
aa.print(); // 5 10 шығарады
bb.print(); // 100 25 шығарады
cc.print(); // 1000 35 шығарады
pa=&aa; pa->print(); // 5 10 шығарады
pa=&bb; // базалық класс объектісіне көрсеткішке туынды класс объектісінің адресі меншіктеледі және компонентті функция шақырылуы орындалады
pa->print(); // 77 25 шығарады
pa=&cc; pa->print(); // 33 35 шығарады
getch();
}
1) А базалық класының конструкторында 1 аргумент бар, сондықтан оның мәні В туынды класы конструкторының қосымша va аргументі арқылы беріледі. B(int va, int vb):A(va),b(vb){} –В класының конструкторы. С класы үшін де осылай.

2) Енді нәтижелер ерекшелігін қарастырайық:


а) объектінің толық атауын қолданып print() компонентті функциясына қатынаған кезде және
б) көрсеткіш арқылы қатынаған кезде көрсеткіш базалық класқа сілтейді және туынды кластың ішкі өрістері қол жетімсіз болады.
Сондықтан базалық кластың print() әдісінің шақырылуы орындалады. Дұрыс нәтиже алу үшін күрделі полиморфизм механизмін қолдану қажет.
Деструкторлар, егер олар қажет болса, конструкторлардың шақырылуына кері ретпен шақырылады. Егер деструктор анықталмаған болса, онда ол үнсіз жағдайда құрылады және қажет жағдайда динамикалық объектіге бөлінген жадыны босатады.




Достарыңызбен бөлісу:
1   2   3




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет