#include using namespace std;
class parent
; virtual void print()//地方1
private:
int a;
};class child :public parent
; virtual void print()//地方1
private:
int a = 0;
};void print(parent &m)//void print(parent *m)也可以,並且這個引數必須是父類,不能定義為子類
一、多型的作用
同樣的呼叫語句根據引數型別不同有多種不同的表現形態。
(物件導向的三大特性另外兩個封裝和繼承,封裝主要通過類這個語言結構體現,使得傳入的引數資訊量更大,除了可以傳入一系列成員變數外,還可以傳入成員函式,即成員方法。繼承主要是能使用已經有的**量)
二、多型實現的三個條件
1.要有繼承關係
2.要有虛函式重寫
3.需要將父類指標或者父類引用作為傳入函式的引數(一定要注意首先傳入的引數必須是父類,子類不可以,其次只能是以指標或者引用的方式,直接傳入乙個父類變數不可以)
三、多型實現的原理
1.當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表,每乙個類都有乙個虛函式表,虛函式表是乙個儲存類成員函式指標的資料結構(地方1處)
2.在建立物件時,編譯器會自動生成乙個vptr指標,指向虛函式表。(地方2處)
3.在程式編譯時,如果檢測到使用的類成員函式是虛函式,不會採用靜態聯編的方式去編譯,而是採取動態聯編,在程式執行到這一步時,根據類變數的vptr指標找到虛函式表中對應的虛函式執行。
注意:1.一些概念
聯編:是指乙個程式模組、**之間相互關聯的過程
靜態聯編(static binding):是程式的匹配、連線在編譯階段實現,過載函式使用靜態聯編,一般預設也是靜態聯編
動態聯編:是指程式聯編推遲到執行時進行,又稱為遲聯編。switch和if語句是動態聯編的例子
過載overload:是函式名相同,引數列表不同 過載只是在類的內部存在。並且其他引數相同,返回型別不同的函式不屬於過載。
重寫override:也叫做覆蓋。子類重新定義父類中有相同名稱和引數的虛函式。函式特徵相同。但是具體實現不同,主要是在繼承關係**現的 。
重寫需要注意:
1 被重寫的函式不能是static的。必須是virtual的
2 重寫函式必須有相同的型別,名稱和引數列表
3 重寫函式的訪問修飾符可以不同。儘管virtual是private的,派生類中重寫改寫為public,protected也是可以的
重定義 (redefining)也叫做隱藏:
子類重新定義父類中有相同名稱的非虛函式( 引數列表可以不同 ) 。
2.繼承建構函式的問題
在結果當中可以看到,子類是繼承了父類的建構函式的,子類繼承父類建構函式的規則是:
1. 如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。
2. 如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。
3. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設無參建構函式。
4. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類自己提供了無參建構函式,則會呼叫父類自己的無參建構函式。(個人理解是3,4和2一樣的意思)
5. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的構造方法,則子類必須顯示呼叫此帶參構造方法)。
6. 如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式,例如fish():animal(400,300),其中fish()是子類的建構函式,animal是父類的建構函式,子類呼叫父類的有參建構函式,需要按照這種格式。
參考文章:
C 複習3(繼承和多型)
目錄 一 繼承 二 多型 1 繼承的本質 復用 2 繼承和派生 派生 從乙個或多個以前定義的類 基類 產生新類的過程稱為派生,這個新類稱為派生類。派生的新類同時可以增加或者重新定義資料和操作,這就產生了類的層次性。繼承 繼承是物件導向語言的乙個重要機制,通過繼承可以在乙個一般類的基礎上建立新類,被繼...
java基礎複習(2) 繼承和多型
多型final類和方法 抽象類 由於子類的構造器不能直接訪問父類的私有域,因此需要呼叫父類的構造器對這些私有域初始化 採用super關鍵字進行呼叫 super語句必須是子類構造器的第一條語句 如果子類構造器沒有顯式地呼叫父類的構造器,將自動呼叫父類預設無參構造器 如果子類構造器既沒有顯式地呼叫父類的...
封裝繼承多型的複習
來自韓順平,點選此處開始學習!定義 super代表父類引用,用於引用父類的屬性和方法。note 訪問時不能訪問private屬性和方法,super.屬性名 super.方法名 引數 2.super用於子類構造器的注意點 必須在構造器第一行,不能與this 共存在同一構造器,如果子類構造器不寫supe...