1.即使是乙個抽象基類,如果它有非靜態資料成員,也應該給它提供一 個帶引數的建構函式,來初始化它的資料成員。或許你可以通過其派生 類來初始化它的資料成員(假如nostatic data member為publish或 protected),但這樣做的後果則是破壞了資料的封裝性,使類的維護和修 改更加困難。由此引申,類的data member應當被初始化,且只在其構造函 數或其member function中初始化。
2.不要將析構函式設計為純虛的,這不是乙個好的設計。將析構函式 設計為純虛函式意味著,即使純虛函式在語法上允許我們只宣告而不定義 純虛函式,但還是必須實現該純虛析構函式,否則它所有的繼承類都將遇 到鏈結錯誤。乙個不能派生繼承類的抽象類有什麼存在的意義?必須定義 純虛析構函式,而不能僅僅宣告它的原因在於:每乙個繼承類的析構函式 會被編譯器加以擴充套件,以靜態呼叫方式其每乙個基類的析構函式(假如有 的話,不論是顯示的還是編譯器合成的),所以只要任何乙個基類的析構 函式缺乏定義,就會導致鏈結失敗。矛盾就在這裡,純虛函式的語法,允 許只宣告而不定義純虛析構函式,而編譯器則死腦筋的看到乙個其基類的 析構函式宣告,則去呼叫它的實體,而不管它有沒有被定義。
3.真的必要的時候才使用虛函式,不要濫用虛函式。虛函式意味著不 小的成本,編譯很可能給你的類帶來膨脹效應:
4.不能決定乙個虛函式是否需要 const ,那麼就不要它。
5.決不在建構函式或析構函式中使用虛函式機制。在建構函式中,每次 呼叫虛函式會被決議為當前建構函式所對應類的虛函式實體,虛函式機制並 不起作用。當乙個base類的建構函式含有對虛函式vf()的呼叫,當其派生類 derived的構造函式呼叫基類base的建構函式的時候,其中呼叫的虛函式vf() 是base中的實體,而不是derived中的實體。這是由vptr初始化的位置決定的 ——在所有基類構造函式呼叫之後,在程式設計師**的**或是成員初始化佇列 之前。因建構函式的呼叫順序是:有根源到末端,由內而外,所以物件的構 造過程可以看成是,從構建乙個最基礎的物件開始,一步步構建成乙個目標 物件。析構函式則有著與構造相反的順序,因此在構造或析構函式中使用虛 函式機制,往往不是程式設計師的意圖。若要在建構函式或析構函式中呼叫虛函 數,應當直接以靜態方式呼叫,而不要通過虛函式機制。
物件導向的設計原則 類設計原則
物件導向設計中,如何通過很小的設計改變就可以應對設計需求的變化,這是令設計者極為關注的問題。為此不少oo先驅提出了很多有關物件導向的設計原則用於指導oo的設計和開發。下面是幾條與類設計相關的設計原則。1.開閉原則 the open closed principle ocp 乙個模組在擴充套件性方面應...
物件導向的設計原則 類設計原則
在物件導向設計中,如何通過很小的設計改變就可以應對設計需求的變化,這是令設計者極為關注的問題。為此不少oo先驅提出了很多有關物件導向的設計原則用於指導oo的設計和開發。下面是幾條與類設計相關的設計原則。1.開閉原則 the open closed principle ocp 乙個模組在擴充套件性方面...
物件導向的設計原則 類設計原則
在物件導向設計中,如何通過很小的設計改變就可以應對設計需求的變化,這是令設計者極為關注的問題。為此不少oo先驅提出了很多有關物件導向的設計原則用於指導oo的設計和開發。下面是幾條與類設計相關的設計原則。乙個模組在擴充套件性方面應該是開放的而在更改性方面應該是封閉的。因此在進行物件導向設計時要盡量考慮...