日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RTTI介绍

發(fā)布時(shí)間:2025/6/15 编程问答 6 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RTTI介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說明:部分內(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é)

以上是生活随笔為你收集整理的RTTI介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。