Негізгі әдебиет-8[б.11,332-337], 7[б.2, 89-93], 6[б.1, 35-42], 5[б.10,375-378]
Бақылау сұрақтары:
Класс үлгілерін анықтауға мүмкіндік бередітін не?
Үгілік функцияға арналған машиналық кодтың шын генерациясы қалай және қашан жүргізіледі?
Үлгілік функцияны шақырғанда нақтыландыру қалай орныдалады?
Белгілі бір функционалдық үлгінің қай функциясы маманданған деп аталады?
6–Дәріс. Мұрагерлік
Мұрагерлік
Кластың қорғалған мүшелері
Конструкторлар, деструкторлар және мұрагерлік.
Мұрагерлік – С++ тіліндегі объектті бағытталған бағдарламалаудың басты механизмдерінің бірі. Оның көмегімен жалпыдан жекеге ауыса отырып өте күрделі кластарды құруға болады, сонымен қатар қортынды кластардан айрықшаланатын жаңа кластарды өсіруге болады.
Жаңа класты жобалай отырып алдын-ала оның объектілері қандай анағұрлым жалпы ерекшеліктерге ие болу керектігін анықтау және ұқсас дайын кластың бар жоқтығын тексеру қажет. Басқаша айтқанда, басында қайта өндіретін класс жоспарын « ірі көріністермен» құрған жөн, ал кейін бір уақытта жаңа қасиеттерді ала отырып, тәртіп пен қасиеттерді (яғни мүше мәліметтер мен класс әдістері) мұраға алатын жаңа кластарды құрылған класс негізінде құра отырып, рет-ретімен бөлшектенуіне көшеміз.
Түрлі класс объектілері мен кластардың өздері алдын-ала құрастырған кластар иерархиясына сай келетін объектілер иерархиясы құрылған кезде мұрагерлік қатынасында бола алады.
Бір класс екінші класс мұрагері болғанда жазбаның келесі негзгі пішіні қолданылады:
{ class_ класс_ аты_ as базалық_ класс_ аты _ туынды
{ туынды класының анықтамасы
Мұндағы as – рұқсат ету спецификаторы ( access specifier) базалық класс элементтері ( base class) туынды класқа (derived class) қалай мұрагер болатынын анықтайды.
Егер as public болса онда барлық ашық мүшелері туынды да да ашық болып қалады. Егер as private шешуші сөзі болса, онда базалық кластың барлық мүшелері туынды класта жабыққа айналады. Екі жағдайда да базалық кластың барлық private мүшелері туынды класта қалай мұрагер болуына тәуелсіз, жабық және рұқсатсыз болып қалады.
Егер 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 >
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 ( ) функциялары туынды класс ішінде рұқсат етілген болады, бұл өте дұрыс, себебі олар бұл кластың жабық мүшелері болып табылады.
Достарыңызбен бөлісу: |