c++,當有乙個指標或引用,但是不知道其指向物件的真實型別是什麼時,可以呼叫虛函式完成特定型別物件的行為。但是有時候,我們需要根據不同的資料構造不同的物件型別,相當於虛擬的建構函式。
1.虛擬建構函式
虛擬建構函式是指能夠根據輸入給穹的資料的不同而建立不同型別的物件。虛擬建構函式可應用於從磁碟(或者通網路連,或者從磁帶機上)讀取物件資訊構造不同型別物件。例如需要編寫乙個程式,用業進行新聞報道的工作,每一條新聞報道都由文字或組成。其具體實現**如下:
1class
nlcomponet2;
67class textblock:public
nlcomponent8;
12class graphic:public
nlcomponent13;
17class
newsletter18;
2728 newsletter::newsletter(istream&str)
2934 }
readcomponent函式,根據所讀取的資料建立乙個的物件,或是textblock或是graphic,它能建立新物件,行為與建構函式相似,而且可以建立不同型別的物件,因而readcomponent函式就是虛擬建構函式。
2.虛擬拷貝建構函式
虛擬拷貝建構函式是一種特殊種類的虛擬建構函式,它能返回乙個指標,指向呼叫該函式的物件的新拷貝。具體實現如下:
1class
nlcomponent2;
7class textblock:public
nlcomponent814
...15
};16
class graphic:public
nlcomponent
1723
...24 };
如上述**所示,類的虛擬拷貝建構函式只是呼叫它們真正的拷貝建構函式,因此「拷貝」的含義與真正拷貝建構函式相同。此外,上述**的實現利用了較寬鬆的虛函式返回值型別規則。被派生類重定義的虛函式不用必須與基類的虛函式具有一樣的返回型別。如果函式的返回型別是乙個指向基類的指標(或引用),那麼派生類的函式可以返回乙個指向基類的派生類的指標(或引用)。
3.非成員函式虛擬化
非成員函式虛擬化是指根據引數的不同動態型別而其行為特性也不同的非成員函式。因為非成員函式不能成為真正的虛函式,要實現類似虛函式的功能,需要借助真正的虛函式。其具體實現方法是:編寫乙個虛函式來完成工作,然後再寫乙個非虛函式,它什麼不做只呼叫這個虛函式。**如下,為textblock和graphic物件實現乙個輸出操作符。
1class
nlcomponent2;
7class textblock:public
nlcomponent8;
13class graphic:public
nlcomponent14;
19 inline ostream& operator
<<(ostream& s,const nlcomponent&c)
20
上述方法只是根據乙個引數讓非成員函式虛擬化,那如何實現根據乙個以上的引數虛擬化呢?
這個問題可以參考:
C 建構函式虛擬化
虛擬建構函式 當你有乙個指標或引用,但是不知道其指向物件的真實型別是什麼時,你可以呼叫虛函式來完成特定型別 type specific 物件的行為。僅當你還沒擁有乙個物件但是你確切地知道想要物件的型別時,你才會呼叫建構函式。那麼虛擬建構函式又從何談起呢?例如假設你編寫乙個程式,用來進行新聞報道的工作...
C 建構函式 拷貝建構函式
建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...
C 構造器(建構函式)
定義和作用 構造器是在構建類的 引用時 自動執行的方法。所以,每個類都必須至少要有乙個構造器。在訪問乙個類的時候,編譯器最先執行構造器中的 它與類同名,帶引數的構造器能夠獲取引數,但是與方法不同的是 構造器雖然也是一種 例項型別 即必須通過例項來進行呼叫,也可以稱之為引用型別 但是卻不能返回任何值 ...