C++的clone函数什么时候需要重载
C++ Primer中的原話:只有析構(gòu)函數(shù)應(yīng)定義為虛函數(shù),構(gòu)造函數(shù)不能定義為虛函數(shù)。構(gòu)造函數(shù)是在對(duì)象完全構(gòu)造之前運(yùn)行的,在構(gòu)造函數(shù)運(yùn)行的時(shí)候,對(duì)象的動(dòng)態(tài)類型還不完整。在構(gòu)造函數(shù)內(nèi)部肯定不會(huì)出現(xiàn)多態(tài)現(xiàn)象。
如轉(zhuǎn)自:http://zhedahht.blog.163.com/blog/static/25411174201102642136998/:
class?A
{
public:
????????A()
????????{
????????????????Print();
????????}
????????virtual?void?Print()
????????{
????????????????printf("A is constructed.\n");
????????}
};
?
class?B:?public?A
{
public:
????????B()
????????{
????????????????Print();
????????}
?
????????virtual?void?Print()
????????{
????????????????printf("B is constructed.\n");
????????}
};
?
int?_tmain(int?argc, _TCHAR* argv[])
{
????????A* pA =?new?B();
????????delete?pA;
?
????????return?0;
}
答案:先后打印出兩行:A is constructed. B is constructed.?調(diào)用B的構(gòu)造函數(shù)時(shí),先會(huì)調(diào)用B的基類及A的構(gòu)造函數(shù)。然后在A的構(gòu)造函數(shù)里調(diào)用Print。由于此時(shí)實(shí)例的類型B的部分還沒有構(gòu)造好,本質(zhì)上它只是A的一個(gè)實(shí)例,他的虛函數(shù)表指針指向的是類型A的虛函數(shù)表。因此此時(shí)調(diào)用的Print是A::Print,而不是B::Print。接著調(diào)用類型B的構(gòu)造函數(shù),并調(diào)用Print。此時(shí)已經(jīng)開始構(gòu)造B,因此此時(shí)調(diào)用的Print是B::Print。
同樣是調(diào)用虛擬函數(shù)Print,我們發(fā)現(xiàn)在類型A的構(gòu)造函數(shù)中,調(diào)用的是A::Print,在B的構(gòu)造函數(shù)中,調(diào)用的是B::Print。因此虛函數(shù)在構(gòu)造函數(shù)中,已經(jīng)失去了虛函數(shù)的動(dòng)態(tài)綁定特性。
但是會(huì)出現(xiàn)這個(gè)需求,需要一個(gè)對(duì)象a產(chǎn)生另一個(gè)對(duì)象b。如果a所屬的類是A,b所屬的類是B,并且B繼承A。如何用a生成b呢?
這就是一種模式,成為 原型模型:從一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可以定制的對(duì)象,而且不需要知道任何創(chuàng)建的細(xì)節(jié)。
在more effective c++的 25條,有很詳細(xì)的闡述。
class NLComponent
{
public:
? ? ? ?virtual NLComponent *clone()const = 0;
}
class TextBlock:public NLComponent
{
public:
virtualTextBlock *clone() const
{
return new TextBlock(*this);
}
}
class Graphic:public NLComponent
{
public:
virtual Graphic *clone()const
?{
return new Graphic(*this);
}
}
要注意到clone這個(gè)虛函數(shù)的返回值不一致,而虛函數(shù)的定義要求,必須返回值,函數(shù)名和參數(shù)列表一致。
這是因?yàn)榉祷刂惦m不一樣,但是其基類都是一致的,所以也能實(shí)現(xiàn)多態(tài)。
虛函數(shù)與重載函數(shù)的比較
1-重載函數(shù)要求函數(shù)有相同的返回值類型和函數(shù)名稱,并有不同的參數(shù)序列;面虛函數(shù)要求這三項(xiàng)(函數(shù)名、返回值類型和參數(shù)序列)完全相同。
2-重載函數(shù)可以是成員函數(shù)或友員函數(shù),面虛函數(shù)只能是成員函數(shù)。
3-重載函數(shù)的調(diào)用是以所傳遞參數(shù)序列的差別作為調(diào)用不同函數(shù)的依據(jù);虛函數(shù)是根據(jù)對(duì)象的不同去調(diào)用不同類的虛函數(shù)。
4-虛函數(shù)在運(yùn)行時(shí)表現(xiàn)出多態(tài)功能,這是C++的精髓,而重載函數(shù)則在編譯時(shí)表現(xiàn)出多態(tài)性。
總結(jié)
以上是生活随笔為你收集整理的C++的clone函数什么时候需要重载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。