1-Дәріс. Объектіге бағытталған бағдарламалаудың технологиясы


Кластардың виртуалды әдістері



бет23/43
Дата07.01.2022
өлшемі357,5 Kb.
#19368
1   ...   19   20   21   22   23   24   25   26   ...   43
Кластардың виртуалды әдістері.

Компилятордан қандай да бір класс әдісін шақырғанда шақырылатын класс атын компиляция сатысында оған сәйкес машиналық кодпен байланыстырудың екі әдісі бар.

Бірақ егер класс әдісін шақыру үшін аты бір және бірдей аргументтер жиыны бар базалық және туынды кластары бар класқа деген көрсеткіш қолданылса (сигнатурасы бірдей), онда компилятор берілетін объект қай класқа қатысты екендігін және ол үшін қандай әдісті шақыру керектігін анықтай алмайды.

Бұл коллизияны шешу үшін С++ тілі виртуалды функцияларды қолдану мүмкіндігін ескереді. Егер қандай да бір класта virtual сияқты сипатталған әдіс бар болса, онда бұндай класқа виртуалды функциялар кестесіне жасырын мүше-көрсеткіш қосылады, сонымен қатар компиляция кезінде емес бағдарлама жұмысы кезінде берілген типтің объектісі үшін сәйкес келетін виртуалды әдісті таңдауға мүмкіндік беретін арнайы кодты генерирлейді( кейін әдісті біріктіру динамикалық түрде әдісті байланыстыру)

Виртуалды функция (virtual fuction) базалық кластың ішінде жарияланады және туынды класта қайта анықталады. Негізінен, виртуалды функция полиморфизм негізінде жатқан «бір интерфейс», «көптеген әдістер» ойларын жүзеге асырады. Виртуалды функция базалық кластың ішінде осы функцияның интерфейс түрін анықтайды.Әрбір виртуалды қайта анықталуы туынды класта оның спецификациясымен байланысты жүзеге асырылуын анықтайды.Сөйтіп қайта анықтау нақты әдісті құрады.

Егер екі немесе одан да көп түрлі кластар виртуалды функуия құрамына енетін базалықтан туындылар болып табылса онда, егер базалық кластың көрсеткіші осы тунды кластардың түрлі объектілеріне сілтеме жасаса, виртуалды функциялардың түрлі нұсқаларын орындайды, себебі компилятор көрсеткіш сілтеме жасайтын объект типіне негізделе отырып виртуалды функция нұсқасын анықтайды! Бұл процесс динамикалық полиморфизм принциптерін жүзеге асыру болып табылады.

Виртуалды функциялардың иерархиялық тәртібі бар бағдарлама мысалын қарастырайық:

# include

class Base

{ public : int i ;

Base (int x) {i=x;}

Vertual void func ( )

{ cout «″ базалық кластың func ( ) функциясын орындау″;

cout « i « endl ;}

};

class Der1 : public Base



{ public: Der1 (int x): Base (x) {}

void func( )

{ cout″ Der кластың func ( ) функциясын орындау: ″;

cout « i*i « endl;}

};

class Der2 : public Base



{ public: Der2 (int x): Base (x) {}

func( ) функциясы ауыстырылмайды

};

int main(void)



Base *p; Base obj (10); Der1 d1_obj(10); Der2 d2_obj(10);

p=& obj;


p- func( ) // базалық кластың func ( ) функциясы

p=&d1_obj;

p- func( ) ; // Der1 туынды класының func ( ) функциясы

p- func( ) // базалық кластың func ( ) функциясы

return 0 ;

}

Егер виртуалды функция туынды класта қайта анықталмаған болса, онда базалық кластан оның нұсқасы қолданылады. Объект көрсеткіші арқылы адрестелетін тип виртуалды функциямен ауыстырылатын белгілі бір нұсқасын шақыруды анықтайды. Бұған қарсылық ретінде виртуалды емес көрсеткіш арқылы шақырылатын интерпретация көрсеткіш типінен ғана тәуелді.



Бірқатар виртуалды әдістермен жұмыс істеудің негізгі ережелерін қарастырайық:

  • Виртуалды болып кез келген функциялар емес, тек қандай да бір клатың компоненттік функциялары табылады.

  • Функция виртуалды болып анықталған соң, оның туынды класта қайта анықталуы ( сигнатурасы бірдей) бұл класта жаңа виртуалды функцияны құрады, сонымен виртуал спецификаторы енді қолданылмауы мүмкін.

  • Туынды класта аты мен сигнатурасы бірдей функцияны анықтауға болмайды, бірақ базалық кластың виртуалды функциясымен салыстырғанда нәтижесінің басқа типімен.

  • Егер виртуалды әдіс туынды класта қайта анықталмаса, онда осы туынды класс объектісі үшін оны шақырған кезде ол анықталған базалық кластың иерархиясы бойынша жақын виртуалды сәйкес әдіске қатынасатын болуы керек.

  • Туынды класс мүшесі базалық кластың виртуалды әдіс атымен сай келетін әдіс аты болуы мүмкін, бірақ сигнатурасы басқа. Онда ол басқа болады, виртуалды емес әдіс.

  • Виртуалды әдістер мұрагерленеді, яғни олар туынды класта қайта анықтау айырмашылығы бар әрекеттерді беру керек болған кезде ғана талап етіледі. Қайта анықтау кезінде рұқсат ету құқықтарын өзгертуге болмайды.

  • Егер виртуалды әдіс туынды класта қайта анықталған болса, онда осы класс объектілері көріну облысына(: : операциясы) рұқсат ету операциясы көмегімен базалық кластың виртуалды әдісіне өту рұқсатын ала алады.



Достарыңызбен бөлісу:
1   ...   19   20   21   22   23   24   25   26   ...   43




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет