為什么不能有虛擬構造函數?
虛擬調用是一種能夠在給定信息不完全(given partial information)的情況下工作的機制。特別地,虛擬允許我們調用某個函數,對于這個函數,僅僅知道它的接口,而不知道具體的對象類型。但是要建立一個對象,你必須擁有完全的信息。特別地,你需要知道要建立的對象的具體類型。因此,對構造函數的調用不可能是虛擬的。
當要求建立一個對象時,一種間接的技術常常被當作“虛擬構造函數”來使用。有關例子,請參見《C++程序設計語言》第三版15.6.2.節。
下面這個例子展示一種機制:如何使用一個抽象類來建立一個適當類型的對象。
struct F { // 對象建立函數的接口
virtual A* make_an_A() const = 0;
virtual B* make_a_B() const = 0;
};
void user(const F& fac)
{
A* p = fac.make_an_A(); // 將A作為合適的類型
B* q = fac.make_a_B(); // 將B作為合適的類型
// ...
}
struct FX : F {
A* make_an_A() const { return new AX(); } // AX是A的派生
B* make_a_B() const { return new BX(); } // AX是B的派生
};
struct FY : F {
A* make_an_A() const { return new AY(); } // AY是A的派生
B* make_a_B() const { return new BY(); } // BY是B的派生
};
int main()
{
user(FX()); // 此用戶建立AX與BX
user(FY()); // 此用戶建立AY與BY
// ...
}
這是所謂的“工廠模式”(the factory pattern)的一個變形。關鍵在于,user函數與AX或AY這樣的類的信息被完全分離開來了。
文章來源于領測軟件測試網 http://www.kjueaiud.com/