Программалау оқулық Алматы, 012 Қазақстан Республикасы Білім жəне ғылым министрлігінің «Оқулық»



Pdf көрінісі
бет354/642
Дата30.03.2022
өлшемі3,66 Mb.
#29231
түріПрограмма
1   ...   350   351   352   353   354   355   356   357   ...   642
Байланысты:
pavlovskaia-jogargy-dengeili

#include  

#include  

class B{

   public: virtual void f1(){};

};

class C: public B{

   public: void f2(){ ... };

};

void demo(B& p){ 


254

   try{

      C& c = dynamic_cast(p); c.f2();

   }

   catch(Bad_cast){ 

      ...

   }

}

int main(){

B* b = new B; demo(*b); // Аластама туындайды

С* c = new C; demo(*c); // Дұрыс

return 0;

}

Қиылысқан түрлендіру

dynamic_cast

 операциясы бір базалық кластың туынды кластарының 

арасындағы түрлендіруді қауіпсіз түрде орындауды қамтамасыз етеді, мысалы:

#include  

#include  

class B{

   public: virtual void f1(){};

};

class C: public B{

   public: void f2(){ ... };

};

class D: public B{ ... }; 

void demo(D* p){

   C* c = dynamic_cast(p); 

   if(c)c->f2();

   else cout <<" орындалмады ";

}

int main(){

   B* b = new C; demo((D*)b); 

   return 0;

}

С

 жəне 


D

 кластары 



В

 класынан туынды болып табылады. 



demo

 функци-


ясына 

D

 класының нұсқауышы беріледі, ол шын мəнінде, оған «ағайынды» 

болып табылатын 

С

 класына нұсқауыш болып табылады, сондықтан



 D

 класы-


нан 

С

 класына типті динамикалық түрде түрлендіру 



demo

 функциясында сəтті 

аяқталады.  

ЕСКЕРТУ 

Функцияға берілетін нұсқауыш жасанды түрде тек типті динамикалық түрлендірудің  

мүмкіндігін көрсету үшін қалыптастырылған.



255

Қажет болса, бір туынды кластың базалық кластары арасындағы 

түрлендіруді де жүзеге асыруға болады, мысалы:

#include  

#include  

class B{

   public: virtual void f1(){ ... };   // B  C 

};                                     // \ / 

class C{                               //  D

   public: virtual void f2(){ ... };

};

class D: public B, public C{};

   void demo(B* b){

   C* c = dynamic_cast(b); 

   if(c)c->f2();

}

int main(){

   D* d = new D; demo(d); 

   return 0;

}

D

 класы 


B

 жəне 


C

 кластарының ұрпағы болып табылады, сондықтан оның 

құрамында осы екі кластың да əдістері сақталады. Егер 

demo

 функциясына



 В

 

класына емес, 



D

 класына деген нұсқауыш берілетін болса, онда оны екінші 



С

 

базалық класына түрлендіруге болады.



static_cast операциясы

static_cast

 операциясы компиляция кезеңінде типтерді түрлендіруді 

келесі типтер арасында жүзеге асыру үшін қолданылады:

□ бүтін 


типтер;

□  бүтін жəне нақты типтер;

□  бүтін жəне тізбелік типтер;

□  түрлендіру бірмəнді түрде болып, ол виртуалды базалық класты 

төмендететін түрлендірумен байланысты болмаған жағдайда, бір 

иерархия объектілеріне нұсқауыштар мен сілтемелер арасында 

атқарылады.

Операцияның форматы:





Достарыңызбен бөлісу:
1   ...   350   351   352   353   354   355   356   357   ...   642




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

    Басты бет