我在做編譯器專案的時候, 我們採用c++語言,但要使用多型的性質,一是用引用,二是用指標。可是引用不夠靈活,指標還具有記憶體管理問題。所以**artptr是乙個必然的選擇,可我發現通常的**artptr不能夠支援多型,原因是編譯器只能進行一次型別轉換,如**artptr->裸指標,但裸指標到他的基類指標不會自動轉換。本篇將實現乙個支援多型的智慧型指標,沒什麼技術含量,大家不要見笑。
原理:既然**artptr->裸指標->基類指標的自動轉換不可能,那麼變乙個方式
**artptr-> **artptr-> base.這就要求**artptr與**artptr之間的繼承結構要與derived與base之間的繼承結構相同。好,讓我們寫乙個吧。
//file:**artptr.h
#ifndef cmm_tool_t**art_ptr_h_
#define cmm_tool_t**art_ptr_h_
//所有類的基類,這個類只是為了統一智慧型指標的用法,下面會看到
class globalbaseobject
};//是所有智慧型指標的基類,提供了一些方法如下:
class globalbaseobjectptr
}//加乙個引用計數
void _safeadd()
//這個析構函式使得任何繼承這個類的智慧型指標不需要定義析構函式,
//因為智慧型指標釋放指標時只需要一次析構
~globalbaseobjectptr()
//之所以使用void*,是為了原始資料型別也可以使用智慧型指標
void* pori;
//引用計數
int* pref;
};template
class **artptr : public b
explicit **artptr(t* oriptr)
**artptr(const **artptr& other)
**artptr& operator =(const **artptr& other)
return (*this);
}t * operator ->()
operator t *()
/*注:不可以定義析構函式,也不需要,因為基類已經實現
*/};
//為了使用方便定義了兩個巨集
#define declare**artptr(dclass,baseclass) typedef **artptr< dclass , baseclass##ptr > dclass##ptr;
#define base**artptr(dclass) typedef **artptr< dclass ,globalbaseobjectptr> dclass##ptr;
#endif
使用方法如下:
class symbol : public globalbaseobject
;class token : public symbol
;class nontoken : public symbol
;class reserved : public token
;base**artptr(symbol)
base**artptr(int)
declare**artptr(token,symbol)
declare**artptr(nontoken,symbol)
declare**artptr(reserved,token)
int main()
C 虛函式 虛繼承 虛基類 多型 智慧型指標
簡記如下 1,什麼是虛函式 基類中被virtual關鍵字修飾的成員函式 基類希望被派生類重新定義 而不是被繼承 普通繼承 的函式 作用 實現多型。通過繼承基類中的虛函式,在子類中過載實現不同操作 2,什麼是虛繼承 虛擬繼承 d繼承自b和c,b和c都繼承自a,這時可以將b和c對a的繼承定義為虛繼承。用...
C 智慧型指標模板類
三個智慧型指標模板 auto ptr unique ptr shared ptr 條件 1 標頭檔案必須包含memory,include 2 智慧型指標模板位於命名空間std,std 或using namespace std 三者的區別 1 所有權。只能有乙個智慧型指標可以擁有乙個特定的物件。aut...
智慧型指標類成員初始化 C 的類與繼承(二)
0 1多繼承 多繼承即乙個子類可以有多個父類,它繼承了多個父類的特性。c 類可以從多個類繼承成員,語法如下 class 1 1 2 2 當上面的 被編譯和執行時,它會產生下列結果 total area 35 total paint cost 2450 02建構函式 類的建構函式是類的一種特殊的成員函...