24
Егер as private болса, онда базалық кластың ашық мүшелері туынды
класта жабық болуына қарамастан олар туынды кластың функция мүшелері
үшін рұқсат етілген болып қалатынын ескерген жөн.
Техникалық жағынан рұқсат ету спецификаторы міндетті емес. Егер ол
көрсетілмеген туынды класс
class шешуші сөзімен анықталса, онда базалық
класс struct қызметші сөзімен үнсіздік бойынша ашық түрде мұра болады.
Түсініктілік үшін рұқсат ету спецификаторын нақты түрде беру дұрыс.
Public спецификаторымен мұрагерлік мысалын көрсетейік:
class Base
{ int x;
public:
void setx (int n) {x=h;}
void showx( ) { cout « x «endl ;}
};
class Derived: public Base
{ int y;
public:
void setx (int n) {x=h;}
void showx( ) { cout « x «endl ;}
};
int main (void)
{ Derived obj;
obj.setx (10);
obj.sety (20);
obj showx( );
obj showy( );
return 0;
}
Base класы ашық болып, мұраға қалдырылатындықтан оның ашық
функциялары туынды класқа ашық болып қалады және сондықтан да
программаның кез келген бөлігінен рұқсат етілген болады. Бұл функцияларды
main ( ) функциясынан сәйкесінше дұрыс шақыру керек.
Базалық кластың мүшелері рұқсат етілмеген болады, сондықтан туынды
класс ішінде х айнымалысына тікелей рұқсат алуға талаптану әрекеті дұрыс
емес. Ал базалық кластың ашық функциясы арқылы бұл мүмкін болады.
Егер класс сияқты жабық мұраға қалса,
онда базалық кластың барлық
мүше деректері мен туынды класта жабық болады және одан тыс қана рұқсат
етілген болады. (Derived типті берілген объекттер үшін олар жабық болады).
Рrivate спецификаторын қолдана отырып мұра ету кезінде базалық
кластың ашық мүшелері туынды класта жабық болады.
# include < iostream.h >
25
class Base
{ int x;
public:
void setx (int n) {x=h;}
void showx( ) { cout « x «endl ;}
};
class Derived: public Base
{ int y;
public:
void setxy(int n, int m) {set(n); y=m;}
void showxy( ) {showx( ) ; cout « y «endl ;}
};
int main (void)
{ Derived obj;
obj.setx (10);
obj.sety (20);
obj showx( );
obj showy( );
return 0;
}
Бұл жағдайда show x ( ) және set x ( ) функциялары туынды класс ішінде
рұқсат етілген болады, бұл өте дұрыс, себебі олар бұл кластың жабық
мүшелері болып табылады.
Кластың қорғалған мүшелері.
Қажет болғанда, базалық класс мүшелері жабық болып қалуы үшін,
туынды класс қолжетімді болуы мүмкін.
Осы идеяны іске асыруда С++ те
protected: спецификаторы қарастырылған. protected: спецификаторының
қолжетімділігі
private:
спецификаторынының
жалғыз ерекшелігі - базалық
кластың қорғалған мүшелері осы базалық кластың барлық туынды кластар
мүшелеріне қолжетімділігіне. Базалықтан тыс немесе туынды кластардың
қорғалған мүшелері қолжетімсіз.
Рrotected спецификаторы кез келген жерінде, әдетте кластың private
мүшелерінен кейін public – класс мүшелерінің алдында орналасуы мүмкін.
Базалық класс туынды кластың ашық (public) сияқты мұрасы болғанда
базалық кластың жабық мүшесі туынды кластың қорғалған мүшесіне
айналады. Базалық класс жабық (private) сияқты мұра болғанда, онда базалық
кластың қорғалған мүшесі туынды кластың жабық мүшесіне айналады.
Сөйтіп мынаны ескерген жөн, туынды клас объектілері үшін
мыналар
рұқсат етілген: базалық кластың объектілері үшін ашық мүше деректері мен
барлық ашық әдістері рұқсат етілген:
-
класс мүшелері болып табылмайтын функциялар;
-
глобальды айнымалылар.
26
Туынды класс ішінде базалық кластың базалық қорғалған мүшелері
рұқсат етілген.
Базалық класс тізімінде туынды класты жариялауға public
модификациялары қолданылады: protected: private: олардың көмегімен
базалық кластың мүшелері рұқсат етілмеуі мүмкін.
Бұл С++ тілінің маңызды функциясы болып, объекттіге бағытталған
программалаудың жақсы стилінің белгісі табылады.
Базалық кластың қорғалған мүшелері туынды кластың қорғалған
мүшелері болады және main функциясы ішінде олар рұқсат етілген болады.
Protected рұқсат ету спецификаторын құрылыммен
бірге де қолдануға
болады.
Конструкторлар, деструкторлар және мұрагерлік.
Егер базалық және туынды кластардың конструкторлары мен
деструкторлар бар болса, онда конструкторлар мұрагерлік тәртіппен, ал
деструктор кері тәртіпте орындалады.
Базалық класта инициализация бірінші болып орындалуы, ал туынды
класс деструкторы объект жойылғанға дейін шақырылуы керек.
Базалық және туынды кластардың барлық қажет аргументтері туынды
класс объектілері құрылғанда туынды класс конструкторына беріледі.
Кейін
туынды класс конструкторын жариялаудың кеңейтілген формасын қолдана
отырып, сәйкес аргументтер әрі қарай базалық класқа беріледі. Аргументтерді
туындыдан базалық класқа берілу синтаксисі төменде көрсетілген:
туынды_класс_конструкторы
(аргументер_тізімі):
базалық_класс
(аргументтер_ тізімі)
Базалық және туынды кластар үшін бірдей элементтерді қолдану рұқсат
етілген. Сонымен туынды класс үшін базалық аргументтерді елемеуге және
тікелей оларды базалық класқа беру рұқсат етілген.
Бақылау сұрақтары:
1)
Базалық және туынды кластар әдістерінің бірдей аттары болуы
мүмкін бе?
2)
Туынды кластың болашақ ұрпағына базалық кластың әдістері мен
деректеріне мұра бола ала ма?
3)
Three класы Two класымен түзілген болсын, ал Two класы One
класымен түзіледі. Бұл әдістің қай түрін Three класы алады?
4)
Базалық класта public түрінде сипатталып өткен әдісті туынды
класта private: түрде сипаттауға бола ма?
5)
Protected қызметші сөзі қандай мақсатта қолданылады?
Достарыңызбен бөлісу: