q11: 我能防止別人從我的類繼承嗎?
a11: 可以的,但何必呢?好吧,也許有兩個理由:
出於效率考慮——不希望我的函式呼叫是虛的
出於安全考慮——確保我的類不被用作基類(這樣我拷貝物件時就不用擔心物件被切割(slicing)了)
根據我的經驗,「效率考慮」常常純屬多餘。在c++中,虛函式呼叫如此之快,和普通函式呼叫並沒有太多的區別。請注意,只有通過指標或者引用呼叫時才會啟用虛擬機制;如果你指名道姓地呼叫乙個物件,c++編譯器會自動優化,去除任何的額外開銷。
如果為了和「虛函式呼叫」說byebye,那麼確實有給類繼承體系「封頂」的需要。在設計前,不訪先問問自己,這些函式為何要被設計成虛的。我確實見過這樣的例子:效能要求苛刻的函式被設計成虛的,僅僅因為「我們習慣這樣做」!
好了,無論如何,說了那麼多,畢竟你只是想知道,為了某種合理的理由,你能不能防止別人繼承你的類。答案是可以的。可惜,這裡給出的解決之道不夠乾淨利落。你不得不在在你的「封頂類」中虛擬繼承乙個無法構造的輔助基類。還是讓例子來告訴我們一切吧:
class usable;
class usable_lock
usable_lock(const usable_lock&) {}
};class usable : public virtual usable_lock ;
usable a;
class dd : public usable ;
dd dd; // error: dd::dd() cannot access
// usable_lock::usable_lock(): private member
(參見《the design and evolution of c++》,11.4.3節)
C 類防止繼承
這裡面介紹一種借用虛繼承和友元機制實現的方法。其實說到底,防止乙個類被繼承,我們還是想怎麼使的派生類在構造時不能夠呼叫基類的建構函式,從而不能完成繼承。我們都知道,派生類物件初始化時,首先要執行基類建構函式,將基類子物件進行初始化,之後再執行派生類的建構函式,初始化派生類中特質不同的成員。下面介紹一...
如何防止乙個類被繼承?
c view第一期 此處一定要宣告,否則在nonderivablehelper類中將nonderivable定義為友元類時,會認為是private中的某個類 class nonderivable namespace private friend class nonderivable ifdef nd...
python 類 繼承 python 類的繼承
1 所用的類都可以被繼承 2 沒有繼承其他類的類必然有乙個父類 object 3子類可以擁有父類的 init 裡的類容 派生子類除了父類的一些屬性,還會有自己的屬性和方法,這些就叫派生 如何使用 實現 class animal def init self,name,attack,hp self.na...