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
операциясы компиляция кезеңінде типтерді түрлендіруді
келесі типтер арасында жүзеге асыру үшін қолданылады:
□ бүтін
типтер;
□ бүтін жəне нақты типтер;
□ бүтін жəне тізбелік типтер;
□ түрлендіру бірмəнді түрде болып, ол виртуалды базалық класты
төмендететін түрлендірумен байланысты болмаған жағдайда, бір
иерархия объектілеріне нұсқауыштар мен сілтемелер арасында
атқарылады.
Операцияның форматы:
Достарыңызбен бөлісу: