C/C++編程筆記:C++入門知識丨繼承和派生
本篇要學(xué)習(xí)的內(nèi)容和知識結(jié)構(gòu)概覽

繼承和派生的概念
派生
通過特殊化已有的類來建立新類的過程, 叫做”類的派生”, 原有的類叫做”基類”, 新建立的類叫做”派生類”. 從類的成員角度看, 派生類自動地將基類的所有成員作為自己的成員, 這叫做”繼承”. 基類和派生類也可以叫做”父類”和”子類”, 也可以叫做”一般類”和”特殊類”.
繼承
類的繼承是指派生類繼承基類的數(shù)據(jù)成員和成員函數(shù). 繼承用來表示類屬關(guān)系, 不能將繼承理解為構(gòu)成關(guān)系
繼承派生的作用
(1)增加新的成員(數(shù)據(jù)成員和成員函數(shù))
(2)重新定義已有的成員函數(shù)
(3)改變基類成員的訪問權(quán)限
單一繼承
一般形式:class 派生類名: 訪問控制 基類名 { private: 成員聲明列表 protected: 成員聲明列表 public: 成員聲明列表}
"冒號"表示新類是哪個基類的派生類
"訪問控制"指繼承方式. 三個方式: public, protected, private
派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)


類的保護成員
如果希望Rect中的showRect()函數(shù)可以一次顯示x, y , w, h. 我們直接修改showRect()函數(shù)是不行的。

報錯 error: 'x' is a private member of ‘Point' 'y' is a private member of ‘Point', x, y為Point類的私有成員, 公有派生時, 在Rect類中是不可訪問的
我們還需要將基類Point中的兩個成員聲明為protected的屬性
像這樣:


訪問權(quán)限和賦值兼容規(guī)則
在根類中, 對于成員的訪問級別有三種, public, protected, private
在派生類中, 對于成員的訪問級別有四種, public(公有), protected(受保護), private(私有), inaccessible(不可訪問)
(1)公有派生和賦值兼容規(guī)則
在公有派生情況下, 基類成員的訪問權(quán)限在派生類中基本保持不變
1.基類的公有成員在派生類中仍然是公有的
2.基類的保護成員在派生類中仍然是受保護的
3.基類的不可訪問的成員在派生類中仍然是不可訪問的
4.基類的私有成員在派生類中變成了不可訪問的
總結(jié): 在公有派生的情況下, 通過派生類自己的成員函數(shù)可以訪問繼承過來的公有和保護成員, 但是不能訪問繼承來的私有成員, 因為繼承過程的私有成員, 變成了第四個級別, 不可訪問的.
賦值兼容規(guī)則:在公有派生的情況下, 一個派生類的對象可以作為基類的對象來使用的情況.?
像這樣:


(2)“isa”和”has-a“的區(qū)別
繼承和派生 isa
比如一個Person類, 派生出一個Student類, 我們可以說Student就是Person, 也就是 Student isa Person, 而反過來則不行.
一個類用另一個類的對象作為自己的數(shù)據(jù)成員或者成員函數(shù)的參數(shù) has-a
像這樣:

表示一個Worker對象有一個名字, 一個地址, 一個電話號碼, has-a的關(guān)系, 包含的關(guān)系
(3)私有派生
通過私有派生, 基類的私有和不可訪問成員在派生類中是不可訪問的, 而公有和保護成員這里就成了派生類的私有成員


因為私有派生不利于進一步派生, 因而實際中私有派生用得并不多
(4)保護派生
保護派生使原來的權(quán)限都降一級使用, 即private變?yōu)椴豢稍L問, protected變?yōu)閜rivate, public變?yōu)閜rotected. 限制了數(shù)據(jù)成員和成員函數(shù)的訪問權(quán)限, 因此在實際中保護派生用得也不多.
比如: 我們在上個例子中, Rect類保護派生于Point, 則在Test類中Point::show();就可以使用啦!
多重繼承
一個類從多個基類派生
格式:
class 派生類名: 訪問控制 基類名1, 訪問控制 基類名2, … {
定義派生類自己的成員
}
像這樣:


二義性及其支配規(guī)則
對基類成員的訪問必須是無二義性的, 如果一個表達式的含義可以解釋為可以訪問多個基類中的成員, 則這種對基類成員的訪問就是不確定的, 稱這種訪問具有二義性
作用域分辨符和成員名限定



格式:類名::標識符
:: 為作用域分辨符, "類名"可以是任一基類或派生類名, “標識符”是該類中聲明的任一成員名
派生類支配基類的同名函數(shù)
如果派生類定義了一個同基類成員函數(shù)同名的新成員函數(shù)(具有相同參數(shù)表的成員函數(shù)), 派生類的新成員函數(shù)就覆蓋了基類的同名成員函數(shù).
在這里, 直接使用成員名只能訪問派生類中的成員函數(shù), 使用作用域運算符, 才能訪問基類的同名成員函數(shù).
派生類中的成員函數(shù)名支配基類中的同名的成員函數(shù)名, 這稱為名字支配規(guī)則.
如果一個名字支配另一個名字, 則二者之間不存在二義性, 當選擇該名字時, 使用支配者的名字.
例如上個例子中

來自一張表的總結(jié)

總結(jié)
C++中的多重繼承可能更靈活, 并且支持三種派生方式, 我們在學(xué)習(xí)一門語言的時候, 更應(yīng)該把精力放在它的特性上面, 不應(yīng)該用什么語言, 都用自己所擅長語言的思考方式, 實現(xiàn)方式等, 要學(xué)會發(fā)揮該語言的優(yōu)勢所在。
自學(xué)C/C++編程難度很大,不妨和一些志同道合的小伙伴一起學(xué)習(xí)成長!

另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~