C 建構函式虛擬化

2022-08-28 01:48:10 字數 1991 閱讀 3408

虛擬建構函式

當你有乙個指標或引用,但是不知道其指向物件的真實型別是什麼時,你可以呼叫虛函式來完成特定型別(type-specific)物件的行為。僅當你還沒擁有乙個物件但是你確切地知道想要物件的型別時,你才會呼叫建構函式。那麼虛擬建構函式又從何談起呢?

例如假設你編寫乙個程式,用來進行新聞報道的工作,一條新聞報道由文字或組成。你可以這樣管理它們:

class nlcomponent ; 

class textblock: public nlcomponent ;

class graphic: public nlcomponent ;

class newsletter ;

在newsletter中使用的list類是乙個標準模板類(stl)。物件newletter不執行時就會儲存在磁碟上。為了能夠通過位於磁碟的替代物來建立newsletter物件,讓newletter的建構函式帶有istream引數是一種很方便的方法。當建構函式需要一些核心的資料結構時,它就從流中讀取資訊。此建構函式的偽**是這樣的:

newsletter::newsletter(istream& str)

}

或者,把這種技巧用於另乙個獨立出來的函式叫做readcomponent,如下所示:

class newsletter ;

newsletter::newsletter(istream& str)

}

考慮一下readcomponent所做的工作。它根據所讀取的資料建立了乙個新物件,或是textblock或是graphic。因為它能建立新物件,它的行為與建構函式相似,而且因為它能建立不同型別的物件,我們稱它為虛擬建構函式。虛擬建構函式是指能夠根據輸入給它的資料的不同而建立不同型別的物件。

虛擬拷貝建構函式

還有一種特殊種類的虛擬建構函式――虛擬拷貝建構函式――也有著廣泛的用途。虛擬拷貝建構函式能返回乙個指標,指向呼叫該函式的物件的新拷貝。因為這種行為特性,虛擬拷貝建構函式的名字一般都是copyself,cloneself或者是象下面這樣就叫做clone。很少會有函式能以這麼直接的方式實現它:

class nlcomponent ;

class textblock: public nlcomponent

...};class graphic: public nlcomponent

...};

類的虛擬拷貝建構函式只是呼叫它們真正的拷貝建構函式。因此」拷貝」的含義與真正的拷貝建構函式相同。如果真正的拷貝建構函式只做了簡單的拷貝,那麼虛擬拷貝建構函式也做簡單的拷貝。如果真正的拷貝建構函式做了全面的拷貝,那麼虛擬拷貝建構函式也做全面的拷貝。

注意上述**的實現利用了最近才被採納的較寬鬆的虛函式返回值型別規則。被派生類重定義的虛函式不用必須與基類的虛函式具有一樣的返回型別。如果函式的返回型別是乙個指向基類的指標(或乙個引用),那麼派生類的函式可以返回乙個指向基類的派生類的指標(或引用)。這不是c++的型別檢查上的漏洞,它使得又可能宣告象虛擬建構函式這樣的函式。這就是為什麼textblock的clone函式能夠返回textblock*和graphic的clone能夠返回graphic*的原因,即使nlcompo-nent的clone返回值型別為nlcomponent*。

在nlcomponent中的虛擬拷貝建構函式能讓實現newletter的(正常的)拷貝建構函式變得很容易:

class newsletter ;

newsletter::newsletter(const newsletter& rhs)

}

遍歷被拷貝的newsletter物件中的整個component鍊錶,呼叫鍊錶內每個元素物件的虛擬建構函式。我們在這裡需要乙個虛擬建構函式,因為鍊錶中包含指向nlcomponent物件的指標,但是我們知道其實每乙個指標不是指向textblock物件就是指向graphic物件。無論它指向誰,我們都想進行正確的拷貝操作,虛擬建構函式能夠為我們做到這點。

以上內容基本都來自《more effective c++》。

C 虛擬建構函式

c 當有乙個指標或引用,但是不知道其指向物件的真實型別是什麼時,可以呼叫虛函式完成特定型別物件的行為。但是有時候,我們需要根據不同的資料構造不同的物件型別,相當於虛擬的建構函式。1.虛擬建構函式 虛擬建構函式是指能夠根據輸入給穹的資料的不同而建立不同型別的物件。虛擬建構函式可應用於從磁碟 或者通網路...

(C )建構函式初始化

vc 中的對於類的定義是有很大的不同。例如在.net程式中對於需要初始化的引數可以直接的賦值,而在vc 中對於需要初始化的引數則需要使用不同的方法。例如對於char字元則需要使用strcpy s函式賦值而相反對於布林型別 bool 整數型別 int 則可以使用運算子 對其初始化。1.定義乙個帶有引數...

C 建構函式初始化

建構函式後面增加冒號一般有三種作用 1 對成員變數的初始化 2 對類成員物件初始化 3 對父類進行初始化 include include using namespace std class a int get key int main 答案 class a 類物件初始化 int get key in...