虛擬調(diào)用是一種能夠在給定信息不完全(given partial information)的情況下工作的機(jī)制。特別地,虛擬允許我們調(diào)用某個(gè)函數(shù),對(duì)于這個(gè)函數(shù),僅僅知道它的接口,而不知道具體的對(duì)象類(lèi)型。但是要建立一個(gè)對(duì)象,你必須擁有完全的信息。特別地,你需要知道要建立的對(duì)象的具體類(lèi)型。因此,對(duì)構(gòu)造函數(shù)的調(diào)用不可能是虛擬的。
當(dāng)要求建立一個(gè)對(duì)象時(shí),一種間接的技術(shù)常常被當(dāng)作“虛擬構(gòu)造函數(shù)”來(lái)使用。有關(guān)例子,請(qǐng)參見(jiàn)《C++程序設(shè)計(jì)語(yǔ)言》第三版15.6.2.節(jié)。
下面這個(gè)例子展示一種機(jī)制:如何使用一個(gè)抽象類(lèi)來(lái)建立一個(gè)適當(dāng)類(lèi)型的對(duì)象。
struct F {
// 對(duì)象建立函數(shù)的接口
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作為合適的類(lèi)型
B* q = fac.make_a_B(); // 將B作為合適的類(lèi)型
// ...
}
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)的一個(gè)變形。關(guān)鍵在于,user函數(shù)與AX或AY這樣的類(lèi)的信息被完全分離開(kāi)來(lái)了。
當(dāng)要求建立一個(gè)對(duì)象時(shí),一種間接的技術(shù)常常被當(dāng)作“虛擬構(gòu)造函數(shù)”來(lái)使用。有關(guān)例子,請(qǐng)參見(jiàn)《C++程序設(shè)計(jì)語(yǔ)言》第三版15.6.2.節(jié)。
下面這個(gè)例子展示一種機(jī)制:如何使用一個(gè)抽象類(lèi)來(lái)建立一個(gè)適當(dāng)類(lèi)型的對(duì)象。
struct F {
// 對(duì)象建立函數(shù)的接口
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作為合適的類(lèi)型
B* q = fac.make_a_B(); // 將B作為合適的類(lèi)型
// ...
}
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)的一個(gè)變形。關(guān)鍵在于,user函數(shù)與AX或AY這樣的類(lèi)的信息被完全分離開(kāi)來(lái)了。