Механизм позднего связывания
Äëя êaæäîãî êëañña (íå îáúåêòa!), ñîäåðæaùåãî õîòя áû îäèí âèðòóaëüíûé ìå- òîä, êîìïèëяòîð ñîçäaåò òaáëèöó âèðòóaëüíûõ ìåòîäîâ (vtbl), â êîòîðîé äëя êa- æäîãî âèðòóaëüíîãî ìåòîäa çaïèñaí åãî aäðåñ â ïaìяòè. Àäðåña ìåòîäîâ ñîäåð- æaòñя â òaáëèöå â ïîðяäêå èõ îïèñaíèя â êëaññaõ. Àäðåñ ëþáîãî âèðòóaëüíîãî ìåòîäa èìååò â vtbl îäíî è òî æå ñìåùåíèå äëя êaæäîãî êëañña â ïðåäåëaõ èåðað- õèè.
Êaæäûé îáúåêò ñîäåðæèò ñêðûòîå äîïîëíèòåëüíîå ïîëå ññûënè ía vtbl, íaçûâaå- ìîå vptr. Îíî çaïîëíяåòñя êîíñòðóêòîðîì ïðè ñîçäaíèè îáúåêòa (äëя ýòîãî êîì- ïèëяòîð äîáaâëяåò â ía÷aëî òåëa êîíñòðóêòîða ñîîòâåòñòâóþùèå èíñòðóêöèè).
Ía ýòaïå êîìïèëяöèè ññûëêè ía âèðòóaëüíûå ìåòîäû çaìåíяþòñя ía îáðaùåíèя ê vtbl ÷åðåç vptr îáúåêòa, a ía ýòaïå âûïîëíåíèя â ìîìåíò îáðaùåíèя ê ìåòîäó åãî aäðåñ âûáèðaåòñя èç òaáëèöû. Òaêèì îáðaçîì, âûçîâ âèðòóaëüíîãî ìåòîäa, â îòëè÷èå îò îáû÷íûõ ìåòîäîâ è ôóíêöèé, âûïîëíяåòñя ÷åðåç äîïîëíèòåëüíûé ýòaï ïîëó÷åíèя aäðåña ìåòîäa èç òaáëèöû. Ýòî íåñêîëüêî çaìåäëяåò âûïîëíåíèå ïðîãðaììû.
Ðånîìåíäóåòñя äåëaòü âèðòóaëüíûìè äåñòðónòîðû äëя òîãî, ÷òîáû ãaðaíòèðî- âaòü ïðaâèëüíîå îñâîáîæäåíèå ïaìяòè èç-ïîä äèíaìè÷åñêîãî îáúåêòa, ïîñêîëüêó â ýòîì ñëó÷aå â ëþáîé ìîìåíò âðåìåíè áóäåò âûáðaí äåñòðóêòîð, ñîîòâåòñòâóþ- ùèé ôaêòè÷åñêîìó òèïó îáúåêòa. Äåñòðóêòîð ïåðåäaåò îïåðaöèè delete ðaçìåð îáúåêòa, èìåþùèé òèï size_t. Åñëè óä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 draw îñóùå- ñòâëяåòñя èç ìåòîäa ïåðåìåùåíèя îáúåêòa. Åñëè òåêñò ìåòîäa ïåðåìåùåíèя íå çaâèñèò îò òèïa ïåðåìåùaåìîãî îáúåêòa (ïîñêîëüêó ïðèíöèï ïåðåìåùåíèя âñåõ
îáúåêòîâ îäèíaêîâ, a äëя îòðèñîâêè âûçûâaåòñя êîíêðåòíûé ìåòîä), ïåðåîïðåäå- ëяòü ýòîò ìåòîä â ïðîèçâîäíûõ êëaññaõ íåò íåîáõîäèìîñòè, è îí ìîæåò áûòü îïè- ñaí êaê íåâèðòóaëüíûé. Åñëè ìåòîä draw âèðòó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æäûé ìîìåíò âðåìåíè.
Do'stlaringiz bilan baham: |