小古銀的官方**(完整教程):
基類和派生類重名的成員變數
基類和派生類重名的成員函式
派生類中使用重名的成員分兩種情況討論:第一種是在類內成員之間使用的情況;第二種是用派生類宣告出物件後使用重名成員的情況。
在講解基類和派生類重名的成員資料型別之前,先看一下成員資料型別的使用。
#include // std::cout std::endl
class base
;int main(void)
輸出結果:
100
由於類的成員型別屬於整個類的,因此不需要在建立乙個物件之後才使用它。
#include // std::is_same
#include // std::cout std::endl std::boolalpha
class base
;class derived : public base
;int main(void)
輸出結果:
是否等於unsigned long long:true
是否等於unsigned long:true
基類將unsigned long long
命名為ullong
,在派生類中同樣使用ullong
,不過它是unsigned long
的別名。從結果可以看出派生類的ullong
就是unsigned long
。換句話說,派生類的重名成員型別會覆蓋掉基類的成員型別。
首先看一下在類成員函式內使用重名成員變數的例子:
#include // std::cout std::endl
class base
;class derived : public base
;int main(void)
base::base(void)
: m_value(2333333)
derived::derived(void)
: m_value(666666)
void derived::show_me(void) const noexcept
void derived::show_base(void) const noexcept
輸出結果:
派生類的成員變數:666666
基類的成員變數:2333333
**中的派生類derived
和基類base
都有成員變數m_value
,然後基類的m_value
初始化為2333333
,而派生類的m_value
初始化為666666
。
從輸出結果可以看出,在派生類內直接使用m_value
,呼叫的是派生類的m_value
,當需要使用基類的m_value
時,需要寫成base::m_value
,這樣派生類就給編譯器指明了:我使用的是base
繼承下來的m_value
而不是我自身m_value
。
#include // std::cout std::endl
class base
;class derived : public base
;int main(void)
輸出結果:
666666
**中的派生類derived
和基類base
都有成員變數m_value
,然後基類的m_value
初始化為2333333
,而派生類的m_value
初始化為666666
。
從輸出結果可以看出,通過derived
建立的obj
,obj.m_value
使用的是派生類的m_value
。如果想使用基類的m_value
,就要指明用的是基類的m_value
,如:obj.base::m_value
。
建議:由於封裝是物件導向設計的思想之一,所以一般很少會暴露出成員變數。尤其像上面這樣,基類和派生類使用重名成員變數並且都是public
,基本上不會有這樣的設計。
#include #include class stringex : public std::string
;int main(void)
else
}
輸出結果:
ab::13::43::ef::66
通過派生類物件使用基類成員函式,可以參考成員變數的做法。
現在**一下,在繼承中,派生類的成員函式跟基類的成員函式的名稱相同的問題。這裡有三種情況:
成員函式名稱相同,引數不同,這個是過載。
成員函式名稱相同,引數也相同,這個也是過載。
使用關鍵字virtual
修飾,成員函式名稱相同,引數也相同,這個是覆蓋。
下面講解一下,重名的成員變數、成員型別和過載的成員函式的情況:
在派生類中:對於基類的私有成員,由於派生類不能訪問和使用,所以不需要考慮。對於基類的受保護成員和公共成員,如果派生類需要使用基類的重名的成員,需要在使用的基類成員名稱前指明使用的是基類的成員而不是本類的成員。因為按照規定,在類中呼叫函式或者變數等,優先呼叫該類的成員,如果沒有的話再呼叫基類或者全域性的,如果都沒有就會編譯報錯。
使用物件時:對於私有成員和受保護成員都不能訪問和使用,所以不需要考慮。通過物件使用公共成員時只能使用派生類的公共成員。特殊情況,如果想呼叫基類的公共成員,需要先用基類的引用或者指標來儲存派生類的物件,然後再操作,這樣就會只呼叫基類的成員;或者在呼叫的時候像上面示例那樣指明基類。
C 入門教程(六十六) 丟擲異常
小古銀的官方 完整教程 使用關鍵字throw丟擲異常。throw不僅僅是丟擲std exception和派生類的物件,其實它可以丟擲所有的變數和值,例如 throw 23333 或者throw std string 小古銀嘿嘿嘿 當丟擲int型別的值時,應該捕獲int型別 include int m...
C 入門教程(八十) 多重繼承
小古銀的官方 完整教程 多重繼承的呼叫順序 多重繼承的呼叫順序總結 多重繼承就是派生類繼承了多個基類。我們知道繼承可以將基類的所有成員都繼承下來作為自己的成員,重繼承也是一樣。include std cout std endl class base1 class base2 class derive...
C 入門教程(六十四) 虛函式和多型
小古銀的官方 完整教程 虛函式和多型 注意事項和建議 補充知識 繼承如果使用錯誤會導致記憶體洩漏,請看下面兩個例子 include class baseclass baseclass void class derivedclass public baseclass derivedclass void...