32
операцияларды қайта жүктеу. Оған кластар мен функциялардың үлгілері
қатысады.
Статикалық байланыстыру операция, кластың, функцияның нақты
данасын анықтау бағдарлама компиляциясының сатысында орындалады(осы
байланыстыру) .
Виртуалды функцияларды қолдану, бұл динамикалық байланыстыру
механизмі арқылы жүзеге асырылады. Бұл форма ОБП негізгі принциптерінің
бірі сияқты полиморфизмнің бір формасы болып табылады.
Динамикалық байланыстыру статикалықпен салыстырғанда виртуалды
функцияның нақты данасын анықтау компиляция сатысында емес, программа
орындаған кезде орындалатындығын білдіреді.
Кластардың виртуалды әдістері.
Компилятордан қандай да бір класс әдісін
шақырғанда шақырылатын
класс атын компиляция сатысында оған сәйкес машиналық кодпен
байланыстырудың екі әдісі бар.
Бірақ егер класс әдісін шақыру үшін аты бір және бірдей аргументтер
жиыны бар базалық және туынды кластары бар класқа деген көрсеткіш
қолданылса (сигнатурасы бірдей), онда компилятор берілетін объект қай
класқа қатысты екендігін және ол үшін қандай әдісті шақыру керектігін
анықтай алмайды.
Бұл коллизияны шешу үшін С++ тілі виртуалды функцияларды қолдану
мүмкіндігін ескереді. Егер қандай да бір класта virtual сияқты сипатталған
әдіс бар болса, онда мұндай класқа виртуалды функциялар кестесіне жасырын
мүше-көрсеткіш
қосылады, сонымен қатар компиляция кезінде емес,
программа жұмысы кезінде деректер тибңнің объектісі үшін сәйкес келетін
виртуалды әдісті таңдауға мүмкіндік беретін арнайы кодты басқарады (кейін
әдісті біріктіру және динамикалық түрде әдісті байланыстыру).
Виртуалды функция (virtual fuction) базалық кластың ішінде
жарияланады және туынды класта қайта анықталады. Негізінен, виртуалды
функция полиморфизм негізінде жатқан «бір интерфейс», «көптеген әдістер»
ойларын жүзеге асырады. Виртуалды функция базалық кластың ішінде осы
функцияның интерфейсі түрін анықтайды. Әрбір виртуалды қайта анықталуы
туынды класта оның спецификациясымен байланысты жүзеге
асырылуын
анықтайды. Сөйтіп қайта анықтау нақты әдісті құрады.
Егер екі немесе одан да көп түрлі кластар виртуалды функция құрамына
жататын базалықтан туындылар болып табылса, онда, егер базалық кластың
нұсқауышы осы туынды кластардың түрлі объектілеріне сілтеме жасаса,
виртуалды функциялардың түрлі нұсқаларын орындайды. Себебі компилятор
нұсқауыш сілтеме жасайтын объект типіне негізделе отырып виртуалды
функция нұсқасын анықтайды. Бұл үдеріс динамикалық полиморфизм
принциптерін жүзеге асыру болып табылады.
Виртуалды функциялардың иерархиялық тәртібі бар программа
мысалын қарастырайық:
34
4)
Егер виртуалды әдіс туынды класта қайта анықталмаса, онда осы
туынды класс объектісі үшін оны шақырған кезде ол анықталған базалық
кластың иерархиясы бойынша жақын виртуалды сәйкес әдіске қатынасатын
болуы керек.
5)
Туынды класс мүшесі базалық кластың виртуалды әдіс атымен сай
келетін
әдіс аты, бірақ сигнатурасы басқа болуы мүмкін. Онда ол басқа
виртуалды емес әдіс болады.
6)
Виртуалды әдістер мұрагерленеді, яғни олар туынды класта қайта
анықтау айырмашылығы бар әрекеттерді беру керек болған кезде ғана талап
етіледі. Қайта анықтау кезінде рұқсат ету құқықтарын өзгертуге болмайды.
7)
Егер виртуалды әдіс туынды класта қайта анықталған болса, онда
осы класс объектілері көріну облысына (:: операциясы) рұқсат ету
операциясы көмегімен базалық кластың виртуалды
әдісіне өту рұқсатын ала
алады.
Виртуалды деструкторлар.
Класс конструкторы виртуалды болуы мүмкін емес, себебі ол типі
белгілі объектті құрған кезде ғана шақырылады. Деструктор виртуалды бола
алады. Оның қажеттілігі базалық класқа нұсқауышпен адрестелетін объекттің
бұзылуымен байланысты. Егер бұл нұсқауыш өзінің жеке деструкторы бар
туынды класс объектісіне сілтеме жасаса, онда көрсетілген объекттердің
корректті бұзылу мәселесі виртуалды әдістерге ұқсас виртуалды
деструкторлармен шешіледі. Егер осындай жағдайда
деструктор виртуалды
сияқты жарияланса, онда барлығы дұрыс орындалып, сәйкес туынды кластың
деструкторы шақырылатын болады. Кейін туынды класс деструкторы
автоматты түрде базалық класс деструкторын шақырады және белгіленген
объект тұтастай жойылады. Одан мына ереже шығады: егер класта виртуалды
әдістер жарияланса, онда деструктор да виртуалды болу керек.
Бақылау сұрақтары:
1)
Туынды класс объект үшін қандай да бір класс әдісін шақыруға бола
ма?
2)
Егер жұмыс көрсеткіштері қолданумен жүргізілсе, онда кластар
иерархиясында виртуалды әдістер не үшін керек?
3)
Қайта жүктелген әдіс құрамына үнсіздік бойынша берілген
параметрлер ене ала ма?
4)
Қандай жағдайда класс әдістерін виртуалды жасау керек емес?
5)
Қандай түрде С++ тілінде полиморфизм жүзеге асырылады?
Достарыңызбен бөлісу: