什麼是多型?
多型性可以簡單地概括為「乙個介面,多種方法」,程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。多型(polymorphism),字面意思多種形態。
c++多型性是通過虛函式來實現的,虛函式允許子類重新定義成員函式,而子類重新定義父類的做法稱為覆蓋(override),或者稱為重寫。
1.過載:
(1)在同乙個作用域下。
(2)函式名相同。
(3)引數不同(個數,型別不同)。
(4)返回值可以不同。
2.重定義/隱藏:
(1)乙個在父類,乙個在子類。
(2)函式名相同。
(3)在基類和派生類中只要不構成重寫就是重定義。
3.重寫/覆蓋:
(1)乙個在父類,乙個在子類。
(2)函式名相同,引數相同,返回值相同,(協變例外)。
(3)基類函式必須有virtual關鍵字。
(4)訪問限定符可以不同。
什麼是繼承?
繼承是物件導向復用的重要手段。通過繼承定義乙個類,繼承是型別之間的關係建模,共享公有的東西,實現各自本質不同的東西。
三種繼承關係下基類成員在派生類的訪問關係變化:
總結:
1. 基類的私有成員在派生類中是不能被訪問的,如果一些基類成員不想被基類物件直接訪問,但需要在派生類中能訪問,就定義為保
護成員。可以看出保護成員限定符是因繼承才出現的。
2. public繼承是乙個介面繼承,保持is-a原則,每個父類可用的成員對子類也可用,因為每個子類物件也都是乙個父類物件。
3. protetced/private繼承是乙個實現繼承,基類的部分成員並未完全成為子類介面的一部分,是 has-a 的關係原則,所以非特殊情
況下不會使用這兩種繼承關係,在絕大多數的場景下使用的都是公有繼承。
4. 不管是哪種繼承方式,在派生類內部都可以訪問基類的公有成員和保護成員,但是基類的私有成員存在但是在子類中不可見(不能
訪問)。
5. 使用關鍵字class時預設的繼承方式是private,使用struct時預設的繼承方式是public,不過最好顯示的寫出繼承方式。
6. 在實際運用中一般使用都是public繼承,極少場景下才會使用protetced/private繼承.
繼承與轉換--賦值相容規則--public繼承
1. 子類物件可以賦值給父類物件(切割/切片)
2. 父類物件不能賦值給子類物件
3. 父類的指標/引用可以指向子類物件
4. 子類的指標/引用不能指向父類物件(可以通過強制型別轉換完成)
單繼承與多繼承:
1. 單繼承:乙個子類只有乙個直接父類時稱這個繼承關係為單繼承
2. 多繼承:乙個子類有兩個或以上直接父類時稱這個繼承關係為多繼承
構成多型的兩個條件:
1.虛函式的重寫
2.父類的指標和引用
(注意:若父類中構造了虛函式,子類中該虛函式重寫可以不加virtual關鍵字,依然可以構成虛函式的重寫。)
多型 多型物件模型
1 什麼多型?當使用基類的指標或引用呼叫重寫的虛函式時,指向父類調的就是父類的虛函式,指向子類調的就是子類的虛函式。下面我們來看一段 sizeof aa 的結果為什麼會是8呢?這是因為函式fun1是乙個虛函式,函式內部存在乙個虛表指標。單繼承物件模型 由於編譯器做了一定的優化,子類中自己定義的函式在...
多型 多型物件模型
一 什麼是多型。物件導向語言有三大特點,封裝 繼承 多型。今天就討論一下多型,多型是 當使用基類的指標或引用呼叫重寫的虛函式時,當指向父類呼叫的就是父類的虛函式,當指向子類就是呼叫子類的虛函式。多型 多種形態。多型分為靜態多型和動態多型。實現多型的其中乙個條件必須是要把子類給給父類,要構成is a的...
多型 多型物件模型
理解多型 所謂多型,其實就是多種 形態 c 中虛函式的主要作用就是實現多型,簡單說父類的指標 引用呼叫重寫的虛函式,當父類指標 引用指向父類物件時呼叫的是父類的虛函式,指向子類物件時呼叫的是子類的虛函式。類別 1 編譯時的多型性。編譯時的多型性是通過過載來實現的。對於非虛的成員來說,系統在編譯時,根...