C 物件導向程式設計中如何判斷乙個物件的類型別

2021-10-03 10:55:28 字數 1467 閱讀 6434

在c++物件導向程式設計中,有時候需要判斷某個物件的類型別,那麼可以有下列兩種方法:

方法1: 採用 typeid()函式進行判斷:(缺點:當存在繼承,並且子類指標賦值給父類指標時,此時判斷的物件型別為父型別,而不是子類型別)

對於乙個父類cfather,其有兩個子類cchildone,cchildtwo。那麼如何判斷乙個物件的類型別。如:

cchildone objchildone;

childtwo* pchildtwo;

if(typeid(objchildone) ==typeid(cchildone))

cout<<」該物件的類型別為cchildone」cout<<」該物件的型別為cchildtwo」《但是這種方法好像存在問題:如cfirstchild類是csuper的子類:

cfirstchild* pchild = new cfirstchild("公尺蘭");

if(typeid(*pchild) ==typeid(cfirstchild))

cout<<"cfirstchild"if(typeid(*pobj) == typeid(csuper))

cout<<"csuper"cout<<"cfirstchild"if(typeid(*pobj2) == typeid(csuper))

cout<<"csuper"cout<<"cfirstchild"delete pobj2;

方法2:最好的方法是定義虛函式返回類型別

在執行時型別識別,最簡單的辦法就是所有的類(父類和子類)實現乙個虛方法返回類名字,根據返回類名字再利用typeid()進行判斷。如:

定義國家父類ccounty,

其中virtual ccounty* getclasstype(void);返回其類型別:

ccounty* ccounty::getclasstype(void)

return this;

定義子類:cusa,同時實現虛函式virtual cusa*getclasstype(void);

cusa* cusa::getclasstype(void)

return this;

定義子類:ciraq,同時實現虛函式virtual ciraq*getclasstype(void);

ciraq* ciraq::getclasstype(void)

return this;

這樣在使用的時候直接呼叫該虛函式getclasstype()就可以返回相應的類名稱,採用typeid()就可以判斷其相應的型別了。如:

ccounty* pcounty = new cusa();

if(typeid(*(pcounty->getclasstype()))== typeid(cusa))//此處是子型別cusa

而:ccounty* pcounty = new ciraq();

if(typeid(*(pcounty->getclasstype()))== typeid(ciraq))//此處是子型別ciraq

如何判斷乙個物件已經無效

引用計數法 給物件中新增乙個引用計數器,每當有乙個地方引用它,計數器就加 1 當引用失效,計數器就減 1 任何時候計數器為 0 的物件就是不可能再被使用的。這個方法實現簡單,效率高,但是目前主流的虛擬機器中並沒有選擇這個演算法來管理記憶體,其最主要的原因是它很難解決物件之間相互迴圈引用的問題。可達性...

如何判斷乙個物件是Element

群裡有個人問這麼判斷乙個物件是element?我查了下 的實現 iselement function obj 的實現,ele function el 的實現iselement function object 顯然iselement 這樣就不行了 好像沒有特別嚴謹的方法,gg了一下,稍作修改,我的is...

譚浩強《C 物件導向程式設計》中的乙個小錯誤

老師與編輯社的辛勤努力!在閱讀 c 物件導向程式設計 3.11類模板時,發現這個小節中有乙個小錯誤。3.11類的模板,在112頁中,宣告了這麼乙個類 1行 class compare int 2 行 5行 int max 6 行 7行 int min 8 行 在113頁倒數第五行,有這麼一條語句 c...