一,繼承和多型;
類之間的繼承;
基類,(父類);
成員變數:描述類的屬性
成員函式:功能
派生類(子類)
體現出與基類的不同
繼承;基類與派生類之間訪問許可權
1.public繼承
.基類裡面的公有成員變數被繼承後在派生類中也是公有的(可以在類外被訪問);
.基類裡面的保護成員變數被繼承後在派生類中可以被訪問,在派生類中的許可權有兩種,protect
(子類物件不能在類外訪問);
.基類裡面的私有成員變數被繼承後在派生類中不能被訪問,但是已經繼承下來(不能在類外訪問);、
2.protected繼承;
3.private繼承;
注意;基類中私有的成員已經被繼承到子類中,但是不能直接訪問!
訪問許可權;public > protectd > private;
賦值相容規則;
1.派生類的物件可以直接賦值給基類的物件,反之不可以。
繼承總結;
1.繼承概念
2.不同繼承方式基類中不同訪問許可權的成員在子類中許可權的改變
3.賦值相容規則----public
4.同名隱藏(派生類訪問不到基類的同名成員了)(要在基類同名成員前加上基類名和作用域限定符)
5.派生類中的預設成員函式
如何讓乙個類不能被繼承?
在基類中,將建構函式設為私有的;派生類的構造初始化不能訪問基類的建構函式,同時類外也不能定義乙個
基類物件。
關鍵字;final;
功能;限制類被繼承.
菱形繼承;單繼承和多繼承復合
缺陷;存在二義性;
解決二義性;
1.讓訪問明確化。
2.虛擬繼承;
比普的繼承多了四個位元組
派生類的物件模型 派生類物件模型,派生類物件模型倒立:基類在下,派生類部分在上。
編譯器為派生類生成了預設建構函式,作用:在建構函式中必須將物件前四個位元組填充完整。
編譯器為派生類生成了預設建構函式,作用:在建構函式中必須將物件前四個位元組填充完整。
多型;1.什麼是多型?
多型(polymorphism)按字面的意思就是「多種狀態」。在物件導向語言中,介面的多種不同的實現方式即為多型。
在c++中也是如此。同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。在執行時,可以通過指向基類的指標,來呼叫實現派生類中的方法。
c++中,實現多型有以下方法:虛函式,抽象類,覆蓋,模板(注意:過載和多型無關)。
2.多型實現的條件;(在繼承體系中)
》基類中必須包含有虛函式,派生類必須對基類中的虛函式進行重寫。
》虛函式的呼叫方式:通過基類的指標或引用呼叫虛函式
表現;多型行為;在程式執行時,安照基類指標指向不同子類物件,呼叫不同子類的虛函式。
兩個條件缺一不可,否則就不能實現多型,不管傳遞那個類的物件,呼叫的都是基類的虛函式。
》重寫;
派生類重寫基類的虛函式(乙個在基類中,乙個在派生類)
派生類虛函式的原型必須與基類中虛函式的原型(返回值型別,函式名字以及引數列表)完全相同
例外;協變-----》基類虛函式返回基類的指標或引用
派生類虛函式返回派生類的指標或引用
基類和派生類虛函式的返回值型別不一樣
析構函式;
基類中析構函式只要是虛函式,派生類的析構函式定義之後就重寫了基類的析構函式
基類和派生類析構函式的名字不同
基類和派生類虛函式的訪問許可權可以不同;一般將基類的虛函式設定成
public
基類和派生類虛函式的訪問許可權可以不同;一般將基類的虛函式設定成public
3.關鍵字;final
final修飾類;---》該類不能被繼承;
final虛函式-----》該虛函式不能被派生類重寫
關建字;override幫助使用者檢查是否能重寫;
數過載 同名隱藏 重寫
4.抽象類;
概念;包含純虛函式的類叫做抽象類。不能例項化物件。
如果乙個類中包含有虛函式
-1.物件多了四個位元組;
-2.該四個位元組內容在構造中進行填充
-3.前四個位元組中放置乙個指標(虛表指標)位址———》指向虛函式
虛函式的存放規則;按照在類中宣告的先後次序進行存放
基類虛表的構建規則;
按照虛函式在類中的宣告次序將其依次放置在虛表中;
派生類虛表的構建規則;
-1.將基類虛表內容拷貝乙份放到派生類虛表中
-2.如果派生類重寫了基類某個虛函式,用派生類自己的虛函式替換,虛表中相同偏移量位置的
基類虛函式
-3.對於派生類自己新增加的虛函式將其按照在類中宣告的先後次序依次放在虛表的最後。
對虛函式呼叫
-1.從物件前四個位元組中獲取虛表的位址
-2.傳遞this指標
-3.從虛表中獲取當前呼叫虛函式的位址
-4.呼叫虛函式
5.多型實現原理
類;虛函式--》類的大小—》多了四個位元組---》監視視窗——》虛函式位址
派生類:空——》虛表中內容與基類完全相同---》但是虛表指標不同(基類與派生類使用的不是同一張
虛表6.多型的呼叫原理:必須滿足實現多型的條件
-1.從物件前四個位元組中取虛表的位址
-2.給虛函式傳參:使用者定義引數和this指標
-3.從虛表中找到系函式的位址
-4.呼叫
內聯函式(編譯時已經展開)**可以通過編譯,不能實現多型。
靜態成員函式為什麼不能作為虛函式?
虛函式呼叫---》必須先要找到虛表---》從物件前四個位元組中獲取虛表指標--->必須要有物件;
靜態成員函式沒有(this)不能建立物件;
建構函式的作用:初始化物件
如果類中包含虛函式,必須在構造中將虛表指標放在物件的前四個位元組中
假設建構函式可以作為虛函式:建構函式--通過虛表呼叫---》從物件前四個位元組去取
建構函式不能作為虛函式。
7.多型分類;靜態多型和動態多型
靜態多型(靜態繫結/早繫結):子啊編譯期間,已經確定應該呼叫那個函式
函式過載 函式模板
動態多型(動態繫結/晚繫結):執行時才確認應該呼叫那個虛函式
在繼承體系中:通過重寫基類虛函式。
8.一般情況不會採用繼承方式--->實現**復用
基類派生列
基類中成員變數以及成員函式繼承到子類中
初始繼承和多型 二(補充)
一.子類與父類 1.子類 父類 例如 dog 子類 anomal 父類 子類 派生類 父類 基類和超類 2.子類可以繼承父類那些成員 非私有成員,但是從技術角度,可以認為是父類的所有成員 軟體系統中的兩個類符合is a時可以使用繼承 例如 student is a person se is a em...
C 繼承和多型
在c 的物件導向的大家庭裡,我感覺繼承算是很重要的了,因為有很多的東西都是依賴於繼承和多型的,所以單獨的在第三篇部落格裡做總結和昇華。繼承在面相物件的地方是乙個很是重要的東西,可以說在物件導向的世界裡沒有了繼承就沒有了這麼多的東西,而沒有了多型就沒有了多彩的世界。類的繼承是最為普遍的事情了,可是類又...
C 繼承和多型
剛學習了c 繼承和多型,對virtual override seal override new有點了解,在此寫下這篇文章以供以後參考,若有錯誤或不足,還望各位指出。這裡有3個類,分別是grandfather father son。好,我們現在來分析一下grandfather的遺產怎麼讓father繼...