程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++:實現類似MFC的IsKindOf功能

C++:實現類似MFC的IsKindOf功能

編輯:C++入門知識

假設需要一個類別庫,改類別庫共包含以下5個類:GrandFather(祖父類)、Father(父類)、Son(兒子類)、Daughter(女兒類)、GrandSon(孫子類)

各個類之間的繼承關系為:

 

相應的代碼為:

View Code

希望實現如下效果:

GrandFather* pGrandSon = << pGrandSon->IsKindof(GrandFather);    
cout << pGrandSon->IsKindof(Father);        
cout << pGrandSon->IsKindof(Son);            
cout << pGrandSon->IsKindof(Daughter);        

 設計思路:

pGrandSon->IsKindof(GrandFather)

為例,想要在運行時判斷:GrandSon 類是否是 GrandFather的子類。

我們知道,GrandSon類的繼承路線是這樣的:GrandSon--->Son--->Father--->GrandFather,因此GrandSon是GrandFather的子類。

所以我們在進行判斷的時候,需要從GrandSon類的父類進行找起,然後一級級的往上找,然後判斷某個父類是否為:GrandFather。

換句話說,想要判斷GrandSon是否是GrandFather的子類,需要“有跡可循”。

以上的“跡”,我們可以通過一個結構體:CRuntimeClass,來進行保存。

該結構體至少需要保存如下信息:類別名稱、串行的Next 指針,以及串行的First 指針。

First指針屬於全域變量,一份就好,所以應該是static變量。

* (PASCAL** CRuntimeClass**

View Code

如:

CRuntimeClass* GrandSon::GetRuntimeClass()  &

返回成員變量classGrandSon的內存地址

接下來,需要完成最重要的一步:填充各個類中CRuntimeClass結構體的數據內容。

ClassFile.cpp

以上代碼將填充CRuntimeClass結構體的

LPCSTR m_lpszClassName(類名)、CRuntimeClass* m_pBaseClass(基類的CRuntimeClass結構地址)。

另外,還有2個成員變量需要進行初始化:pFirstClass和m_pNextClass

pFirstClass是靜態的,需要初始化為NULL:CRuntimeClass* CRuntimeClass::pFirstClass = NULL;

m_pNextClass的初始化操作,可以通過以下的結構體構造函數來完成:

在ClassFile.h頭文件中,增加如下代碼:

*->m_pNextClass ==

以上代碼定義了一個結構體:AFX_CLASSINIT,並在結構體的構造函數中(C++中結構體也是有構造函數的……)對m_pNextClass 和 pFirstClass進行賦值。

在通初始化結構體的其他成員變量一樣,需要我們手動在ClassFile.cpp文件中添加初始化另外幾個成員變量的代碼:

 AFX_CLASSINIT _init_GrandFather(&
 AFX_CLASSINIT _init_Father(&
 AFX_CLASSINIT _init_Son(&
 AFX_CLASSINIT _init_Daughter(&
 AFX_CLASSINIT _init_GrandSon(&GrandSon::classGrandSon);

當執行以上代碼的時候,將把各個類中的CRuntimeClass結構體串聯起來。

這樣,經過以上的步驟,整個類別庫表就構造好了!類似下圖所示:

有了以上的類庫表之後,實現IsKindOf()函數的功能就輕而易舉了:

BOOL GrandFather::IsKindof( CRuntimeClass* pClass)* pClassThis =(pClassThis != (pClassThis === pClassThis->

接著,就可以在main函數中進行調用了:

* pGrandSon = << << pGrandSon->IsKindof(&GrandFather::classGrandFather)<< << << pGrandSon->IsKindof(&Father::classFather)<< << << pGrandSon->IsKindof(&Son::classSon) << << << pGrandSon->IsKindof(&Daughter::classDaughter) << 

參考資料:

《深入淺出MFC》

曾是土木人

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved