Ð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ññ:
mOnstr *p;
// Óêaçaòåëü ññûëaåòñя ía îáúåêò ïðîèçâîäíîãî êëañña:
p = new daemOn;
Âûçîâ ìåòîäîâ îáúåêòa ïðîèñõîäèò â ñîîòâåòñòâèè ñ òèïîì óêaçaòåëя, a íå ôaê- òè÷åñêèì òèïîì îáúåêòa, ía êîòîðûé îí ññûëaåòñя, ïîýòîìó ïðè âûïîëíåíèè îïåðaòîða, íaïðèìåð,
p->draw(1, 1, 1, 1);
áóäåò âûçâaí ìåòîä êëañña mOnstr, a íå êëañña daemOn, ïîñêîëüêó ññûëêè ía ìåòîäû ðaçðåøaþòñя âî âðåìя êîìïîíîâêè ïðîãðaììû. Ýòîò ïðîöåññ íaçûâaåòñя ðaííèì
1 Ïåðåîïðåäåëяòü â ïðîèçâîäíîì êëaññå ðåêîìåíäóåòñя òîëüêî âèðòóaëüíûå ìåòîäû (ñì. ñëåä. ðaçäåë).
ñâяçûâaíèåì. ×òîáû âûçâaòü ìåòîä êëañña daemOn, ìîæíî èñïîëüçîâaòü яâíîå ïðå- îáðaçîâaíèå òèïa óêaçaòåëя:
((daemOn * p))->draw(1, 1, 1, 1);
Ýòî íå âñåãä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 ëþáîé ïðîèçâîäíûé êëaññ. Äðóãîé ïðèìåð — ñâяçíûé ñïèñîê óêaçaòåëåé ía ðaçëè÷íûå îáúåêòû èåðaðõèè, ñ êîòîðûì òðåáóåòñя ðaáîòaòü åäèíîîáðaçíî.
 C++ ðåaëèçîâaí ìåõaíèçì ïîçäíåãî ñâяçûâaíèя, êîãäa ðaçðåøåíèå ññûëîê ía ìåòîä ïðîèñõîäèò ía ýòaïå âûïîëíåíèя ïðîãðaììû â çaâèñèìîñòè îò êîíêðåòíî- ãî òèïa îáúåêòa, âûçâaâøåãî ìåòîä. Ýòîò ìåõaíèçì ðåaëèçîâaí ñ ïîìîùüþ âèðòó- aëüíûõ ìåòîäîâ è ðaññìîòðåí â ñëåäóþùåì ðaçäåëå.
Äëя îïðåäåëåíèя âèðòóaëüíîãî ìåòîäa èñïîëüçóåòñя ñïåöèôèêaòîð virtual, ía- ïðèìåð:
virtual vOid draw(int x, int y, int sCale, int pOsitiOn);
Ðaññìîòðèì ïðaâèëa îïèñaíèя è èñïîëüçîâaíèя âèðòóaëüíûõ ìåòîäîâ.
Åñëè â áaçîâîì êëaññå ìåòîä îïðåäåëåí êaê âèðòóaëüíûé, ìåòîä, îïðåäåëåííûé â ïðîèçâîäíîì êëaññå ñ òåì xå èìåíåì è í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ñña ñ ïîìîùüþ îïåðaöèè äîñòóïa ê îáëañòè âèäèìîñòè.
Âèðòóaëüíûé ìåòîä íå ìîæåò îáúяâëяòüñя ñ ìîäèôèêaòîðîì statiC, íî ìîæåò áûòü îáúяâëåí êaê äðóæåñòâåííûé.
Åñëè â êëaññå ââîäèòñя îïèñaíèå âèðòóaëüíîãî ìåòîäa, îí äîëæåí áûòü îïðå- äåëåí õîòя áû êaê ÷èñòî âèðòóaëüíûé.
×èñòî âèðòóaëüíûñ ìåòîä ñîäåðæèò ïðèçíaê = 0 âìåñòî òåëa, íaïðèìåð:
virtual vOid f(int) = 0;
×èñòî âèðòóaëüíûé ìåòîä äîëæåí ïåðåîïðåäåëяòüñя â ïðîèçâîäíîì êëaññå (âîç- ìîæíî, îïяòü êaê ÷èñòî âèðòóaëüíûé).
Åñëè îïðåäåëèòü ìåòîä draw â êëaññå mOnstr êaê âèðòóaëüíûé, ðåøåíèå î òîì, ìå- òîä êaêîãî êëañña âûçâaòü, áóäåò ïðèíèìaòüñя â çaâèñèìîñòè îò òèïa îáúåêòa, ía êîòîðûé ññûëaåòñя óêaçaòåëü:
mOnstr *r, *p;
r = new mOnstr; // Cîçäaåòñя îáúåêò êëañña mOnstr
p = new daemOn; // Cîçäaåòñя îáúåêò êëañña daemOn r->draw(1, 1, 1, 1); // Âûçûâaåòñя ìåòîä mOnstr::draw
p->draw(1, 1, 1, 1); // Âûçûâaåòñя ìåòîä daemOn::draw
p-> mOnstr::draw(1, 1, 1, 1); // Îáõîä ìåõaíèçìa âèðòóaëüíûõ ìåòîäîâ
Åñëè îáúåêò êëañña daemOn áóäåò âûçûâaòü ìåòîä draw íå íåïîñðåäñòâåííî, a êîñ- âåííî (òî åñòü èç äðóãîãî ìåòîäa, îïðåäåëåííîãî â êëaññå mOnstr), áóäåò âûçâaí ìåòîä draw êëañña daemOn.
Èòaê, âèðòóaëüíûì íaçûâaåòñя ìåòîä, ññûëna ía nîòîðûñ ðaçðåøaåòñя ía ýòaïå âûïîëíåíèя ïðîãðaììû (ïåðåâîä êðañèâîãî aíãëèéñêîãî ñëîâa virtual — â äaííîì çía÷åíèè âñåãî-íaâñåãî «ôaêòè÷åñêèé», òî åñòü ññûëêa ðaçðåøaåòñя ïî ôaêòó âû- çîâa).
Do'stlaringiz bilan baham: |