RTTI介绍
說明:部分內(nèi)容來自<<程序員面試寶典>>和RTTI百度百科。
RTTI(run type identification):通過運(yùn)行時(shí)類型信息程序能夠使用基類的指針或引用來檢查這些指針或引用所指的對象的實(shí)際派生類型。有些讀者認(rèn)為設(shè)計(jì)類時(shí)使用虛函數(shù)就已經(jīng)足夠了,可是虛函數(shù)本身有局限性,當(dāng)涉及類別階層時(shí),需要判斷某個(gè)對象所屬的類別,而因?yàn)轭悇e設(shè)計(jì)中大量使用虛函數(shù),所以使得這一工作難以實(shí)現(xiàn),但又極其重要,于是使用RTTI的typeid運(yùn)算符能使程序員確定對象的動(dòng)態(tài)類型。
?
typeid操作符:返回指針和引用所指的實(shí)際類型
dynamic_cast操作符:將基類類型的指針或引用安全轉(zhuǎn)換為派生類型的指針或引用。(一個(gè)實(shí)際指向子類對象的指針被轉(zhuǎn)換成了父類指針,然后再用dynamic_cast轉(zhuǎn)換回來,一定會(huì)成,而一個(gè)實(shí)際指向父類對象的指針,被dynamic_cast轉(zhuǎn)換為子類指針,一定會(huì)失敗。成功返回1,失敗返回0)
?
#include<iostream> using namespace std;class base { public:virtual void funcA(){cout<<"base"<<endl;} };class derived:public base { public:virtual void funcB(){cout<<"derived"<<endl;} };void funC(base *p) {derived *dp=dynamic_cast<derived *>(p);//p是要轉(zhuǎn)換的指針,將指針p的類型轉(zhuǎn)換為(derived *)類型if(dp!=NULL)dp->funcB();elsep->funcA(); }void funcD(base *p) {derived *dp=NULL;if(typeid(*p)==typeid(derived))//如果p是指針,typeid(*p)返回p所指派生類類型,typeid(p)返回基類類型{dp=static_cast<derived *>(p);dp->funcB();} elsep->funcA();}int main() {base *cp=new derived;cout<<typeid(cp).name()<<endl;//打印cp類型名cout<<typeid(cp).name()<<endl;funcD(cp);funcC(cp);base *p=new base;funcC(dp);funcD(dp);return 0; }打印:
class base *
class base *
derived
derived?
base
base
?
dynamic_cast和static_cast區(qū)別:
static_cast是c的強(qiáng)制轉(zhuǎn)換,有一定的冒險(xiǎn)性(信息丟失,內(nèi)存越界)。
dynamic_cast是嘗試性的轉(zhuǎn)換,具有類型檢查功能。轉(zhuǎn)換成功返回新類型的合法指針,轉(zhuǎn)換失敗返回空指針。比較安全。
當(dāng)我們能確定轉(zhuǎn)換是安全的時(shí)候用static_cast更快一些。
?
?
?
總結(jié)
- 上一篇: 类会默认产生的成员函数
- 下一篇: 剖析递归求二叉树高