Bjarne:我能防止別人繼承我自己的類嗎?

字號:

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