c++ view第一期:
/*此處一定要宣告,否則在nonderivablehelper類中將nonderivable定義為友元類時,會認為是private中的某個類*/
class nonderivable;
namespace private
friend class nonderivable;
};
}
#ifdef ndebug
#define final_class
#else
#define final_class : private virtual private::nonderivablehelper
#endif
class nonderivable final_class
;
初次看到這個例子時,對其中的private virtual繼承方法不是很理解。而這種繼承方式恰恰是該例子的精華部分。在此引用san_daniel(丹少爺)和xiterator(xi)的解釋 。
san_daniel(丹少爺):
virtual在這裡的意思是虛擬繼承。它主要是為了解決多重繼承時基類資料在子類中出現兩次以上,從而引起訪問二義的問題。例
class a;
class b:public a
{};
class c:public a
{};
class d:public b, public c
{}//here d has 2 copy of a::i, one comes from b and another comes from c
在上述情況下,對c::i的訪問是二義的,但如果b, c都虛擬繼承a,編譯器將保證這種情況不會出現。
xiterator(xi):
類的繼承體系中若有類成為virtual base class(即與其子類之間均通過virtual方式繼承的話),那麼其建構函式的呼叫是由最終具體類(本例wanttoderive)來做的。而wanttoderive是經由nonderivable private繼承nonderivablehelper,所以無法呼叫nonderivablehelper的建構函式。
若將virtual去掉,則nonderivablehelper建構函式的呼叫是由nonderivable來做的,而nonderivable是nonderivablehelper的友元,所以可以訪問相應的建構函式。
從以上解釋我們可以看到,該例子主要使用了c++中virtual繼承方式和友元不能被繼承的兩個特性。通過將nonderivablehelper 的建構函式定義為private,同時將子類nonderivable宣告為該類的友元類。因此nonderivable可以例項化。但由於nonderivable是通過virtual方式繼承的nonderivablehelper ,因此其子類的構造函式呼叫nonderivablehelper 的建構函式時,是直接呼叫,而不是通過nonderivable其呼叫,故出現「不能呼叫私有的nonderivablehelper::nonderivablehelper()」錯誤,從而實現了nonderivable不能被繼承的目的。
乙個類如何防止被拷貝
在c 中,對於類我們如何防止被拷貝?首先,我們知道,在c 類中,我們是如何實現對類例項化物件的拷貝。是通過該類中的拷貝建構函式和賦值運算子的過載來實現的,那麼我們可以通過禁止在類外使用這兩種方法來達到防止該類被拷貝的目的。具體怎麼做 將拷貝建構函式和賦值運算子的過載,宣告為private 私有,類外...
如何定義乙個不能被繼承的類
方法一 將建構函式宣告為私有的 如果把乙個類的建構函式宣告為私有的,那麼這個類就不能被繼承。但是這也引入了乙個問題,不能在類外定義這個類的物件,所以我們還需要在類內定義乙個靜態的成員函式來返回建立的這個物件。class aa protected aa 方法二 我們可以宣告乙個輔助的類a,把類a這個類...
如何實現乙個不能被繼承的類
首先我們要知道,在c 中,子類的建構函式會呼叫基類的構造進行合成,要想乙個類不被繼承,只要把它的建構函式定義成私有,子類就沒有辦法訪問基類建構函式,從而就阻止了進行子類構造物件 可是問題又來了,你把乙個類的建構函式定義為私有的,那它自己也定義不出物件,這該如何解決。這時我們想到了靜態函式,靜態成員函...