標籤:情況下 父類 原則 details 父類繼承 預設 link 必須 建構函式
一 建構函式與解構函式的執行順序
c++中對象都是先構造成員變數,再調用自身的建構函式;故父類成員變數首先被構造,然後調用父類的建構函式,再構造子類的成員變數,最後調用子類的建構函式。
對象析構時與構造順序相反,子類先調用自身的解構函式,再調用子類成員變數的解構函式,再調用父類的解構函式,再析構父類的成員變數。
二 子類的建構函式寫法
1)
構造方法用來初始化類的對象,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類對象時,為了初始化從父類繼承來的資料成員,系統需要調用其父類的構造方法。
如果沒有顯式的建構函式,編譯器會給一個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地聲明建構函式情況下建立。
構造原則如下:
1. 如果子類沒有定義構造方法,則調用父類的無參數的構造方法。
2. 如果子類定義了構造方法,不論是無參數還是帶參數,在建立子類的對象的時候,首先執行父類無參數的構造方法,然後執行自己的構造方法。
3. 在建立子類對象時候,如果子類的建構函式沒有顯示調用父類的建構函式,則會調用父類的預設無參建構函式。
4. 在建立子類對象時候,如果子類的建構函式沒有顯示調用父類的建構函式且父類自己提供了無參建構函式,則會調用父類自己的無參建構函式。
5. 在建立子類對象時候,如果子類的建構函式沒有顯示調用父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有參數的構造方法,則子類必須顯示調用此帶參構造方法)。
2)子類調用父類帶參數建構函式的方法
class Camera {public: explicit Camera(camera_set *set);};class MyCamera: public Camera {public: MyCamera(camera_set *set) : Camera(set) { }};
三 對象初始化的兩種方式
對象調用建構函式有兩種方式,如下
Camera camera(&set);
Camera *camera=new Camera(&set);
參考引用:
C++中成員變數 父類 子類構造析構順序
C++繼承中關於子類建構函式的寫法
C++建構函式與解構函式