1、c++中通過virtual關鍵字對多型進行支援,使用virtual宣告的函式被重寫後即可展現多型特性。
注意和虛繼承的區別。雖然用的是同乙個關鍵字,但意義完全不同。
2、多型的意義:多型可以使用未來,80年**了乙個框架,可以呼叫90年**的**。
多型是設計模式的基礎,多型是框架的基礎。
3、多型成立的條件
3.1 要有繼承
3.2 要有虛函式重寫
3.3 要有父類指標(父類引用)指向子類物件
4、演示**:
class parent
virtual void print() //給乙個成員函式 定義為 虛函式。
private:
int a;
};class child :public parent
//重定義父類函式: 發生在子類和父類之間
//當子類重寫父類的成員函式,如果父類中這個函式不是虛函式, 是函式的重定義
//當子類重寫父類的成員函式,如果父類中這個函式是 虛函式。 是函式的重寫。
virtual void print()
private:
int b;
};void myprintfunc(parent *p) // 讓父類指標指向子類物件的時候,
int main(void)
5、析構函式可以是虛的。虛析構函式用於指引 delete 運算子正確析構動態物件 。
class a
virtual void print()
virtual ~a() }
private:
char *p;
};class b : public a
//重寫
virtual void print()
virtual ~b() }
private:
char *p;//和a類的p一樣,都是個字的私有成員
};void func(a *p)//p = cp; p = &c //用父類指標指向子類物件。
void mydelete(a*p) //p->cp 父類指標指向子類物件
6、多型的實現原理:
6.1 當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表,虛函式表是乙個儲存類 成員函式指標 的資料結構,是由編譯器自動生成與維護的,virtual成員函式會被編譯器放入虛函式表中。
6.2 存在虛函式時,每個物件中都有乙個指向虛函式表的指標(vptr指標)。
6.3 通過虛函式表,指標vptr呼叫重寫函式是在程式執行時進行的,因此需要通過定址操作才能確定真正應該呼叫的函式。 而普通成員函式是在編譯時就確定了呼叫的函式。在效率上, 虛函式的效率要低很多。出於效率考慮,沒有必要將所有成員函式都宣告為虛函式。
6.4 乙個類中不管有幾個虛函式,vptr指標只會存在乙個。
7、建構函式中能否呼叫虛函式,實現多型??
不能,因為物件在建立的時,由編譯器對vptr指標進行初始化,只有當物件的構造完全結束後vptr的指向才最終確定。
父類物件的vptr指向父類虛函式表,子類物件的vptr指向子類虛函式表。
8、純虛函式:
8.1 純虛函式是乙個在基類中說明的虛函式,在基類中沒有定義,要求任何派生類都定義自己的版本。
8.2 純虛函式不需要定義,只需要申明即可。
8.3 純虛函式的語法:virtual 型別 函式名(參數列) = 0;
8.4 含有純虛函式的類,稱為抽象基類,不可實列化。 即不能建立物件,存在的意義就是被繼承,提供族類的公共介面。
8.5 如果乙個類中宣告了純虛函式,而在派生類中沒有對該函式定義,
則該虛函式在派生類中仍然為純虛函式,派生類仍然為純虛基類。
//圖形類
//擁有純虛函式的類, 就叫抽象類
class shape
;//圓類
//如果 乙個子類繼承了抽象類, 那麼一定要重寫這個純虛函式。
class circle :public shape
//重寫父類抽象類的純虛函式
virtual double getarea()
virtual void print()
private:
double r;//半徑
};//實現乙個正方形
class rect :public shape
//是乙個抽象的介面,說明圖形是有乙個得到面積方法
virtual double getarea()
//頂乙個列印面積的介面
virtual void print()
private:
double a;//邊長
};//乙個傳遞抽象類 指標的架構函式
void printarea(shape *p)
//業務層
int main(void)
c 多型總結
多型 多型可以簡單地概括為 乙個介面,多種方法 程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。接下來,我寫乙個簡單地函式來說明多型 includeusing namespace std int add int left,int right float add float left...
C 多型總結
多型繫結分兩種情況,一種是靜態繫結即編譯時多型,一種是動態繫結即執行時多型是利用過載實現的。對於非虛函式的成員來說,系統在編譯時,按照函式的引數的區別來繫結要實現的操作,在編譯時就確定了呼叫哪個函式。簡單地說,虛函式是動態繫結的基礎 動態繫結是實現執行時多型的基礎。要觸發動態繫結,需滿足兩個條件 1...
C 多型總結
多型概念 同乙個事物在不同環境下具有不同的狀態 虛函式概念 在函式返回值前加上 virtual 關鍵字 多型分類 靜態多型 早繫結 在編譯器編輯時確認要呼叫的函式 1 函式過載 2 泛型程式設計 動態多型 晚繫結 在程式執行時確認將要呼叫的函式 1 基類中存在虛函式 2 繼承當中對基類進行重寫並且 ...