C+之父力作學習筆記6——派生類
現在來考慮做一個程序,處理某公司所雇傭人員的問題。這個程序可能包含如下一種數據結構:





















按照這種方式從Employee派生出Manager,就使Manager成為Employee的一個子類型,使Manager可以用在能夠接受Employee的任何地方。因為Manager是Employee,所以Manager*就可以當做Employee*使用。然而,因為Employee不一定是Manager,所以Employee*就不能當做Manager*用。總而言之類Derived有一個公用基類Base,那么就可以用Derived*給Base*類型的變量賦值,不需要顯示的類型轉換。而相反的方向,從Base*到Derived*則必須顯示轉換。例如:








派生類的成員可以使用其基類的公用的和保護的成員,但是,派生類不能使用基類的私有成員。對于派生類的成年公園而言,保護成員就像是公用成員;但對于其他函數它們則像是私用成員。
下面說說派生類的構造函數和析構函數
有些派生類需要構造函數。如果某個基類中有構造函數,那么就必須調用這些構造函數中的某一個。默認構造函數可以被隱含的調用,但是,如果一個基類的所有構造函數都有參數,那么就必須顯示的調用其中的某一個?;悩嬙旌瘮档膮祽谂缮悩嬙旌瘮档亩x中有明確描述。在這方面,基類的行為恰恰就像是派生類的一個成員。例如:
















對于給定的一個類型為Base*的指針,被指的對象到底屬于哪個派生類型呢?這個問題有四種基本的解決方案:
- 保證被指的只能是唯一類型的對象
- 在基類里安排一個類型域,供函數檢查
- 使用dynamic_cast
- 使用虛函數
從Employee的函數中取得“正確的”行為i,而又不依賴于實際使用的到底是哪一種Employee,這就是所謂的多態性。一個帶有虛函數的類型被稱為是一個多態類型。要在C++里取得多態行為,被調用的函數就必須是虛函數,而對象則必須是通過指針或者引用去操作的。如果直接操作一個對象(而不是通過指針或引用),它的確切類型就已經為編譯器所知,因此也就不需要運行時的多態性了。
那么一個虛函數聲明為純虛函數,則這個虛函數所在的類為抽象類。用=0作為初始式就使虛函數成為“純虛的”。注意:不能創建抽象類的對象。抽象類只能做界面,作為其他類的基類。還有一點也要指的注意,一個未在派生類里定義的純虛函數仍舊還是一個純虛函數,這種情況也將使該派生類仍為一個抽象類。例如:















Circel a;//錯誤:聲明的是抽象類Circel對象
抽象類的最重要用途就使提供一個界面,而又不是暴露任何實現的細節。
忠告 :
- 避免類型域
- 用抽象類將設計的中心集中到提供清晰的界面方面
- 用抽象類使界面最小化
- 一個有虛函數的類應該有一個虛析構函數
- 抽象類通常不需要構造函數
posted on 2011-08-28 17:20 Daywei 閱讀(2000) 評論(0) 編輯 收藏 引用 所屬分類: C++之父力作學習筆記