Bjarne:為什么不能有虛擬構(gòu)造函數(shù)?

字號(hào):

虛擬調(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)了。