Bjarne:我能防止別人繼承我自己的類(lèi)嗎?

字號(hào):

可以,但你為什么要那么做呢?這是兩個(gè)常見(jiàn)的回答:
    效率:避免我的函數(shù)被虛擬調(diào)用
    安全:保證我的類(lèi)不被用作一個(gè)基類(lèi)(例如,保證我能夠復(fù)制對(duì)象而不用擔(dān)心出事)
    根據(jù)我的經(jīng)驗(yàn),效率原因往往是不必要的擔(dān)心。在C++中,虛擬函數(shù)調(diào)用是如此之快,以致于它們?cè)谝粋€(gè)包含虛擬函數(shù)的類(lèi)中被實(shí)際使用時(shí),相比普通的函數(shù)調(diào)用,根本不會(huì)產(chǎn)生值得考慮的運(yùn)行期開(kāi)支。注意,僅僅通過(guò)指針或引用時(shí),才會(huì)使用虛擬調(diào)用機(jī)制。當(dāng)直接通過(guò)對(duì)象名字調(diào)用一個(gè)函數(shù)時(shí),虛擬函數(shù)調(diào)用的開(kāi)支可以被很容易地優(yōu)化掉。
    如果確實(shí)有真正的需要,要將一個(gè)類(lèi)封閉起來(lái)以防止虛擬調(diào)用,那么可能首先應(yīng)該問(wèn)問(wèn)為什么它們是虛擬的。我看見(jiàn)過(guò)一些例子,那些性能表現(xiàn)不佳的函數(shù)被設(shè)置為虛擬,沒(méi)有其他原因,僅僅是因?yàn)椤拔覀兞?xí)慣這么干”。
    這個(gè)問(wèn)題的另一個(gè)部分,由于邏輯上的原因如何防止類(lèi)被繼承,有一個(gè)解決方案。不幸的是,這個(gè)方案并不完美。它建立在這樣一個(gè)事實(shí)的基礎(chǔ)之上,那就是:大多數(shù)的繼承類(lèi)必須建立一個(gè)虛擬的基類(lèi)。這是一個(gè)例子:
    class Usable;
    class Usable_lock {
    friend class Usable;
    private:
    Usable_lock() {}
    Usable_lock(const Usable_lock&) {}
    };
    class Usable : public virtual Usable_lock {
    // ...
    public:
    Usable();
    Usable(char*);
    // ...
    };
    Usable a;
    class DD : public Usable { };
    DD dd; // 錯(cuò)誤: DD::DD() 不能訪問(wèn)
    // Usable_lock::Usable_lock()是一個(gè)私有成員