我認爲這些所謂的「虛擬構造函數」一糟糕的設計使用而不是構造函數。這些只不過是虛擬函數,應該在類的實例的使用開始時被調用。
從鏈接您發佈:
class Browser
{
public:
//virtual default constructor
virtual Browser* construct() {return new Browser;}
};
讓我們添加一個成員字段:
class Browser
{
int member;
public:
//virtual default constructor
virtual Browser* construct() {return new Browser;}
};
我們需要初始化成員字段,我們該怎麼做呢?
class Browser
{
int member;
public:
//virtual default constructor
virtual Browser* construct()
{
Browser* b = new Browser;
b->member = 0;
return b;
}
};
考慮一個情況,當有人忘記使用template <class T> void func(T & obj)
和做這樣的事情:
Browser b;
printf("member=%d", b.member);
這種方式使用未初始化的領域。沒有辦法阻止它。
現在,在這種情況下
class Browser
{
int member;
public:
Browser() : member(0) { }
virtual Browser* construct() { /* some init stuff */ return new Browser;}
};
默認構造函數總是使用和成員字段總是初始化。 但是,將construct()
稱爲「虛擬構造函數」,我認爲這是一種命名濫用。
我上面顯示的模式很常見,例如。在MFC中。 CWnd和類似的類使用構造函數來初始化實例和Create(...)
函數來完全初始化和創建控件。無論如何,我永遠不會把Create(...)
函數稱爲「虛擬構造函數」。
看起來像寫得很差的工廠模式。 – kennytm 2010-05-21 19:07:44
看起來像一個Java開發人員正試圖跨越C++而不理解範例。 – 2010-05-21 19:56:13