Энергетика



Pdf көрінісі
бет13/23
Дата07.02.2022
өлшемі1,03 Mb.
#91462
түріПрограмма
1   ...   9   10   11   12   13   14   15   16   ...   23
Байланысты:
is 1

 
 
8 Дәріс №8. Полиморфизм
Дәрістің мақсаты:
кластың үш қасиетінің бірі полиморфизмды 
түсіндіру. 
Дәрістің мазмұны:
кластардың виртуалды әдістері. Виртуалды 
деструкторлар. 
Объектіге бағытталған программалаудың (ОБП) үшінші принципі 
полиморфизм («көп пішімдік») болып табылады. Полиморфизм (опера-
цияларды, функцияларды қайта жүктеу, кластар мен функциялардың 
мүшелері) операцияның, кластың немесе функцияның бір аттас деректердің 
түрлі типтері үшін қолданылады.
С++ тілінде полиморфизм екі формаға ие болады. Статикалық 
байланыстыру механизмі көмегімен жүзеге асырылатын функциялар мен 


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


33 
# 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)
Виртуалды болып кез келген функциялар емес, тек қандай да бір 
клатың компоненттік функциялары табылады. 
2)
Функция виртуалды болып анықталған соң, оның туынды класта 
қайта анықталуы (сигнатурасы бірдей) бұл класта жаңа виртуалды функцияны 
құрады, сонымен виртуал спецификаторы енді қолданылмауы мүмкін. 
3)
Туынды класта аты мен сигнатурасы бірдей функцияны, бірақ 
базалық кластың виртуалды функциясымен салыстырғанда нәтижесінің басқа 
типімен анықтауға болмайды. 


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


Достарыңызбен бөлісу:
1   ...   9   10   11   12   13   14   15   16   ...   23




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

    Басты бет