繼續編寫技能部分,為了保證代碼的整潔,所以把player.h的參數傳傳送給skill.h,在skill.cpp中進行代碼修改。 所運用的知識: 構造方法用來初始化類的對象,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類對象時,為了初始化從父類繼承來的資料成員,系統需要調用其父類的構造方法。 如果沒有顯式的建構函式,編譯器會給一個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地聲明建構函式情況下建立。 構造原則如下: 1. 如果子類沒有定義構造方法,則調用父類的無參數的構造方法。 2. 如果子類定義了構造方法,不論是無參數還是帶參數,在建立子類的對象的時候,首先執行父類無參數的構造方法,然後執行自己的構造方法。 3. 在建立子類對象時候,如果子類的建構函式沒有顯示調用父類的建構函式,則會調用父類的預設無參建構函式。 4. 在建立子類對象時候,如果子類的建構函式沒有顯示調用父類的建構函式且父類自己提供了無參建構函式,則會調用父類自己的無參建構函式。 5. 在建立子類對象時候,如果子類的建構函式沒有顯示調用父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有參數的構造方法,則子類必須顯示調用此帶參構造方法)。 6. 如果子類調用父類帶參數的構造方法,需要用初始化父類成員對象的方式,比如: #include <iostream.h> class animal { public: animal(int height, int weight) { cout<<"animal construct"<<endl; } … }; class fish:public animal { public: fish():animal(400,300) { cout<<"fish construct"<<endl; } … }; void main() { fish fh; } 在fish類的建構函式後,加一個冒號(:),然後加上父類的帶參數的建構函式。這樣,在子類的建構函式被調用時,系統就會去調用父類的帶參數的建構函式去構造對象。這種初始化方式,還常用來對類中的常量(const)成員進行初始化,如下面的代碼所示: class point { public: point():x(0),y(0) private: const int x; const int y; }; |