在C++中子類繼承和呼叫父類的建構函式方法
構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。
如果沒有顯式的建構函式,編譯器會給一個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地宣告建構函式情況下建立。
構造原則如下:
1. 如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。
2. 如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。
3. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設無參建構函式。
4. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類自己提供了無參建構函式,則會呼叫父類自己的無參建構函式。
5. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的構造方法,則子類必須顯示呼叫此帶參構造方法)。
6. 如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式,比如:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"><span class="pln" style="color:#000000;"> </span><span class="com" style="color:#8800;">#include</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;"><iostream.h></span> <span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">class</span><span class="pln" style="color:#000000;"> animal</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span> <span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">public</span><span class="pun" style="color:#66660;">:</span> <span class="pln" style="color:#000000;"> animal</span><span class="pun" style="color:#66660;">(</span><span class="kwd" style="color:#0088;">int</span><span class="pln" style="color:#000000;"> height</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pln" style="color:#000000;"> weight</span><span class="pun" style="color:#66660;">)</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span> <span class="pln" style="color:#000000;"> cout</span><span class="pun" style="color:#66660;"><<</span><span class="str" style="color:#0880;">"animal construct"</span><span class="pun" style="color:#66660;"><<</span><span class="pln" style="color:#000000;">endl</span><span class="pun" style="color:#66660;">;</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">}</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">…</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">};</span> <span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">class</span><span class="pln" style="color:#000000;"> fish</span><span class="pun" style="color:#66660;">:</span><span class="kwd" style="color:#0088;">public</span><span class="pln" style="color:#000000;"> animal</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span> <span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">public</span><span class="pun" style="color:#66660;">:</span> <span class="pln" style="color:#000000;"> fish</span><span class="pun" style="color:#66660;">():</span><span class="pln" style="color:#000000;">animal</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">400</span><span class="pun" style="color:#66660;">,</span><span class="lit" style="color:#06666;">300</span><span class="pun" style="color:#66660;">)</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span> <span class="pln" style="color:#000000;"> cout</span><span class="pun" style="color:#66660;"><<</span><span class="str" style="color:#0880;">"fish construct"</span><span class="pun" style="color:#66660;"><<</span><span class="pln" style="color:#000000;">endl</span><span class="pun" style="color:#66660;">;</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">}</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">…</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">};</span> <span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">void</span><span class="pln" style="color:#000000;"> main</span><span class="pun" style="color:#66660;">()</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span> <span class="pln" style="color:#000000;"> fish fh</span><span class="pun" style="color:#66660;">;</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">}</span> </p>
在fish類的建構函式後,加一個冒號(:),然後加上父類的帶引數的建構函式。這樣,在子類的建構函式被呼叫時,系統就會去呼叫父類的帶引數的建構函式去構造物件。這種初始化方式,還常用來對類中的常量(const)成員進行初始化,如下面的程式碼所示:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"><span class="kwd" style="color:#0088;">class</span><span class="pln" style="color:#000000;"> point</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span> <span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">public</span><span class="pun" style="color:#66660;">:</span> <span class="pln" style="color:#000000;"> point</span><span class="pun" style="color:#66660;">():</span><span class="pln" style="color:#000000;">x</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">0</span><span class="pun" style="color:#66660;">),</span><span class="pln" style="color:#000000;">y</span><span class="pun" style="color:#66660;">(</span><span class="lit" style="color:#06666;">0</span><span class="pun" style="color:#66660;">)</span> <span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">private</span><span class="pun" style="color:#66660;">:</span> <span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">const</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pln" style="color:#000000;"> x</span><span class="pun" style="color:#66660;">;</span> <span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">const</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">int</span><span class="pln" style="color:#000000;"> y</span><span class="pun" style="color:#66660;">;</span> <span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">};</span> </p>
當然,類中普通的成員變數也可以採取此種方式進行初始化,然而,這就沒有必要了。
來源:http://hi.baidu.com/fwxh101/blog/item/bb9ef38051474d8cf603a68b.html相關文章
- 在 C++ 中子類繼承和呼叫父類的建構函式方法C++繼承函式
- 子類繼承父類的建構函式(方法)嗎?繼承函式
- 類的繼承_子類繼承父類繼承
- C++:建構函式的分類和呼叫C++函式
- es5建構函式,es6類和類的繼承函式繼承
- 子類繼承父類(父類和子類裡:塊、靜態塊、構造和方法覆寫)之間呼叫順序繼承
- 父類和子類的建構函式問題函式
- c# abstract抽象類與繼承類子類的建構函式_baseC#抽象繼承函式
- java關於繼承父類,需要實現父類中的構造方法Java繼承構造方法
- 19-父類的建構函式函式
- 區分:派生類指定基類建構函式、繼承構造、委託構造函式繼承
- C++ 類建構函式和解構函式C++函式
- JS原型繼承和類式繼承JS原型繼承
- C++知識點49——類繼承與類的構造、拷貝、operator=和解構函式C++繼承函式
- [C++]繼承和派生類C++繼承
- C# 繼承 子類(派生類) 父類(基類)C#繼承
- js建構函式的繼承JS函式繼承
- 繼承中的建構函式繼承函式
- Java建構函式的繼承Java函式繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- C++ | 類繼承C++繼承
- C#建構函式繼承C#函式繼承
- c# 繼承派生類的預設建構函式的初始化次序C#繼承函式
- C++學習筆記-----類和建構函式C++筆記函式
- C++ 派生類函式過載與虛擬函式繼承詳解C++函式繼承
- 繼承與派生,多繼承,函式過載,建構函式呼叫順序 靜態多型和動態多型繼承函式多型
- 再論C++建構函式分類和呼叫時機以及匿名物件C++函式物件
- Java建構函式的繼承問題Java函式繼承
- 建構函式的繼承問題 (轉)函式繼承
- 類的建構函式和解構函式函式
- iOS 繼承&類方法iOS繼承
- 如何使用python super函式呼叫父類?Python函式
- 建構函式、原型、原型鏈、繼承函式原型繼承
- C++語言之結構體、類、建構函式、拷貝建構函式C++結構體函式
- C#介面、抽象類、普通類和繼承(子類與父類)都有其特定的用途和場景C#抽象繼承
- C++ 類中呼叫基類帶引數建構函式以及常量如何初始化C++函式
- 類的繼承和派生繼承
- 建構函式的prototype與各種繼承函式繼承