Ключ доступа
|
Спецификатор базового класса
|
Доступ в производном классе
|
Комментарий
|
private
|
private
prOteCted publiC
|
private
private private
|
âñå private
|
prOteCted
|
private
prOteCted publiC
|
private
prOteCted prOteCted
|
âñå prOteCted, êðîìå private
|
publiC
|
private
prOteCted publiC
|
private
prOteCted publiC
|
íå èçìåíяåòñя
|
Êaê âèäíî èç òaáëèöû, private ýëåìåíòû áaçîâîãî êëañña â ïðîèçâîäíîì êëaññå íåäîñòóïíû âíå çaâèñèìîñòè îò êëþ÷a. Îáðaùåíèå ê íèì ìîæåò îñóùåñòâëяòüñя òîëüêî ÷åðåç ìåòîäû áaçîâîãî êëañña.
Ýëåìåíòû prOteCted ïðè íañëåäîâaíèè ñ êëþ÷îì private ñòaíîâяòñя â ïðîèçâîä- íîì êëaññå private, â îñòaëüíûõ ñëó÷aяõ ïðaâa äîñòóïa ê íèì íå èçìåíяþòñя.
Äîñòóï ê ýëåìåíòaì publiC ïðè íañëåäîâaíèè ñòaíîâèòñя ñîîòâåòñòâóþùèì êëþ-
÷ó äîñòóïa.
Åñëè áaçîâûé êëaññ íañëåäóåòñя ñ êëþ÷îì private, ìîæíî âûáîðî÷íî ñäåëaòü íå- êîòîðûå åãî ýëåìåíòû äîñòóïíûìè â ïðîèçâîäíîì êëaññå, îáúяâèâ èõ â ñåêöèè publiC ïðîèçâîäíîãî êëañña ñ ïîìîùüþ îïåðaöèè äîñòóïa ê îáëañòè âèäèìîñòè:
Class Base{
…
publiC: vOid f();
};
Class Derived : private Base{
…
publiC: Base::vOid f();
};
Ïðîñòûì íaçûâaåòñя íañëåäîâaíèå, ïðè êîòîðîì ïðîèçâîäíûé êëaññ èìååò îäíî- ãî ðîäèòåëя. Äëя ðaçëè÷íûõ ìåòîäîâ êëañña ñóùåñòâóþò ðaçíûå ïðaâèëa íañëå-
äîâaíèя — íaïðèìåð, êîíñòðóêòîðû è îïåðaöèя ïðèñâaèâaíèя â ïðîèçâîäíîì êëaññå íå íañëåäóþòñя, a äåñòðóêòîðû íañëåäóþòñя. Ðaññìîòðèì íañëåäîâaíèå êëaññîâ è ïðîáëåìû, âîçíèêaþùèå ïðè ýòîì, ía ïðèìåðå.
Cîçäaäèì ïðîèçâîäíûé îò êëañña mOnstr êëaññ daemOn, äîáaâèâ ïîëåçíóþ â íåêî- òîðûõ ñëó÷aяõ ñïîñîáíîñòü äóìaòü. Áaçîâûé êëaññ ïðèâåäåí ñ íåêîòîðûìè ìåòî- äaìè, äîáaâëåííûìè â ïðåäûäóùèõ ðaçäåëaõ:
enum COlOr {red, green, blue};
// ------------- Êëaññ mOnstr -------------
Class mOnstr{
// ------------- Cêðûòûå ïîëя êëañña: int health, ammO;
COlOr skin;
Char *name;
publiC:
// Êîíñòðóêòîðû:
mOnstr(int he = 100, int am = 10); mOnstr(COlOr sk);
mOnstr(Char * nam); mOnstr(mOnstr &M);
// Äåñòðóêòîð:
~mOnstr() {delete [] name;}
// Îïåðaöèè:
mOnstr& OperatOr ++(){
++health; return *this;
}
mOnstr OperatOr ++(int){
mOnstr M(*this); health++; return M;
}
OperatOr int(){ return health;
}
bOOl OperatOr >(mOnstr &M){
if( health > M.get_health()) return true; return false;
}
COnst mOnstr& OperatOr = (mOnstr &M){ if (&M == this) return *this;
if (name) delete [] name; if (M.name){
name = new Char [strlen(M.name) + 1]; strCpy(name, M.name);}
else name = 0;
health = M.health; ammO = M.ammO; skin = M.skin; return *this;
}
// ------------- Ìåòîäû äîñòóïa ê ïîëяì:
int get_health() COnst {return health;} int get_ammO() COnst {return ammO;}
// ------------- Ìåòîäû, èçìåíяþùèå çía÷åíèя ïîëåé: vOid Change_health(int he){ health = he;}
// ------------- Ïðî÷èå ìåòîäû:
vOid draw(int x, int y, int sCale, int pOsitiOn);
};
// ------------- Ðåaëèçaöèя êëañña mOnstr -------------
mOnstr::mOnstr(int he, int am):
health (he), ammO (am), skin (red), name (0){} mOnstr::mOnstr(mOnstr &M){
if (M.name){
name = new Char [strlen(M.name) + 1]; strCpy(name, M.name);}
else name = 0;
health = M.health; ammO = M.ammO; skin = M.skin;
}
mOnstr::mOnstr(COlOr sk){ switCh (sk){
Case red : health = 100; ammO = 10; skin = red; name = 0; break; Case green: health = 100; ammO = 20; skin = green; name = 0; break; Case blue: health = 100; ammO = 40; skin = blue; name = 0; break;
}
}
mOnstr::mOnstr(Char * nam){
name = new Char [strlen(nam)+1]; strCpy(name, nam);
health = 100; ammO = 10; skin = red;
}
vOid mOnstr::draw(int x, int y, int sCale, int pOsitiOn)
{ /* … Îòðèñîâêa mOnstr */ }
// Êëaññ daemOn
Class daemOn : publiC mOnstr{ int brain;
publiC:
// Êîíñòðóêòîðû:
daemOn(int br = 10){brain = br;}; daemOn(COlOr sk) : mOnstr (sk) {brain = 10;}
daemOn(Char * nam) : mOnstr (nam) {brain = 10;} daemOn(daemOn &M) : mOnstr (M) {brain = M.brain;}
// Îïåðaöèè:
COnst daemOn& OperatOr = (daemOn &M){ if (&M == this) return *this; brain = M.brain;
mOnstr::OperatOr = (M); return *this;
}
// ------------- Ìåòîäû, èçìåíяþùèå çía÷åíèя ïîëåé: vOid think();
// ------------- Ïðî÷èå ìåòîäû:
vOid draw(int x, int y, int sCale, int pOsitiOn);
};
// ------------- Ðåaëèçaöèя êëañña daemOn -------------
vOid daemOn::think(){ /* … */ }
vOid daemOn::draw(int x, int y, int sCale, int pOsitiOn)
{ /* … Îòðèñîâêa daemOn */ }
 êëaññå daemOn ââåäåíî ïîëå brain è ìåòîä think, îïðåäåëåíû ñîáñòâåííûå êîíñò- ðóêòîðû è îïåðaöèя ïðèñâaèâaíèя, a òaêæå ïåðåîïðåäåëåí ìåòîä îòðèñîâêè draw. Âñå ïîëя êëañña mOnstr, îïåðaöèè (êðîìå ïðèñâaèâaíèя) è ìåòîäû get_health, get_ammO è Change_health íañëåäóþòñя â êëaññå daemOn, a äåñòðóêòîð ôîðìèðóåòñя ïî óìîë÷aíèþ.
Ðaññìîòðèì ïðaâèëa íañëåäîâaíèя ðaçëè÷íûõ ìåòîäîâ.
Êîíñòðónòîðû íå íañëåäóþòñя, ïîýòîìó ïðîèçâîäíûé êëaññ äîëæåí èìåòü ñîáñò- âåííûå êîíñòðóêòîðû. Ïîðяäîê âûçîâa êîíñòðóêòîðîâ îïðåäåëяåòñя ïðèâåäåí- íûìè íèæå ïðaâèëaìè.
Åñëè â êîíñòðóêòîðå ïðîèçâîäíîãî êëañña яâíûé âûçîâ êîíñòðóêòîða áaçîâî- ãî êëañña îòñóòñòâóåò, aâòîìaòè÷åñêè âûçûâaåòñя êîíñòðóêòîð áaçîâîãî êëañ- ña ïî óìîë÷aíèþ (òî åñòü òîò, êîòîðûé ìîæíî âûçâaòü áåç ïaðaìåòðîâ). Ýòî èñïîëüçîâaíî â ïåðâîì èç êîíñòðóêòîðîâ êëañña daemOn.
Äëя èåðaðõèè, ñîñòîяùåé èç íåñêîëüêèõ óðîâíåé, êîíñòðóêòîðû áaçîâûõ êëaññîâ âûçûâaþòñя ía÷èíaя ñ ñaìîãî âåðõíåãî óðîâíя. Ïîñëå ýòîãî âûïîë- íяþòñя êîíñòðóêòîðû òåõ ýëåìåíòîâ êëañña, êîòîðûå яâëяþòñя îáúåêòaìè, â ïîðяäêå èõ îáúяâëåíèя â êëaññå, a çaòåì èñïîëíяåòñя êîíñòðóêòîð êëañña.
 ñëó÷aå íåñêîëüêèõ áaçîâûõ êëaññîâ èõ êîíñòðóêòîðû âûçûâaþòñя â ïîðяä- êå îáúяâëåíèя.
Do'stlaringiz bilan baham: |