c 中的多型

2021-10-03 07:31:35 字數 2247 閱讀 1776

多型指的是同乙個行為,有不同的表現形式,在c++中,要實現多型的函式,必須在其函式前面加上virtual函式,否則,起不到多型作用。

不加virtual關鍵字的後果:

#include using namespace std;

class parent

void print() //子類的和父類的函式名字一樣

protected:

private:

int a;

};class child : public parent

void print()

protected:

private:

int b;

};void main()

/**輸出:

parent a20

parent a10

child b30

parent 列印 a:20

parent 列印 a:10

*/

分析:在上面的**中,重寫的函式print沒有加上virtual關鍵字,然後在main中用parent指標接收的時候,哪怕讓它指向乙個子類的型別,呼叫的結果也是父類的print函式,這是因為,這在c++中是靜態聯編的(沒有加virtual關建字的時候),根據指標的型別從而就決定其指向什麼型別。(c/c++是靜態編譯型語言,在編譯時,編譯器自動根據指標的型別判斷指向的是乙個什麼樣的物件,在編譯此函式的時,編譯器不可能知道指標 p 究竟指向了什麼。編譯器沒有理由報錯。於是,編譯器認為最安全的做法是編譯到父類的print函式,因為父類和子類肯定都有相同的print函式。)

但是在加了virtual關鍵字之後,多型的作用就體現出來,具體**如下,注意看**注釋:

#include using namespace std;

class parent

virtual void print() //子類的和父類的函式名字一樣

protected:

private:

int a;

};class child : public parent

virtual void print()

protected:

private:

int b;

};void main()

/**輸出:

parent a20

parent a10

child b30

parent 列印 a:20

child 列印 b:30

*/

再看另外乙個多型的例子:

#include using namespace std;

//herofighter advherofighter enemyfighter

class herofighter

};class enemyfighter

};class advherofighter : public herofighter

};class advadvherofighter : public herofighter

};//多型威力

//1 playobj給物件搭建舞台 看成乙個框架

//15:20

void playobj(herofighter *hf, enemyfighter *ef)

else }

//多型的思想

//物件導向3大概念

//封裝: 突破c函式的概念....用類做函式引數的時候,可以使用物件的屬性 和物件的方法

//繼承: a b **復用

//多型 : 可以使用未來...

//多型很重要

//實現多型的三個條件

//c語言 間接賦值 是指標存在的最大意義

//是c語言的特有的現象 (1 定義兩個變數 2 建立關聯 3 *p在被呼叫函式中去間接的修改實參的值)

//實現多型的三個條件

//1 要有繼承

//2 要有虛函式重寫

//3 用父類指標(父類引用)指向子類物件....

void main()

else

if (advhf.power() > ef.attack())

else

cout<<"hello..."《總結:

多型可以面向未來(只要介面跟以前相同,多型封裝成框架之後,可以呼叫未來的**),實現多型的3個要求:

(1) 要有繼承

(2) 要有虛函式過載

(3) 要有父類的指標或者引入指向子類物件

C 中的多型

封裝 繼承 多型,物件導向的三大特性,前兩項理解相對容易,但要理解多型,特別是深入的了解,對於初學者而言可能就會有一定困難了。我一直認為學習oo的最好方法就是結合實踐,封裝 繼承在實際工作中的應用隨處可見,但多型呢?也許未必,可能不經意間用到也不會把它跟 多型 這個詞對應起來。在此拋磚引玉,大家討論...

C 中的多型

c 中的多型分為靜多型和動多型 也就是靜態繫結和動態繫結兩種現象 靜動的區別主要在於這種繫結發生在編譯期還是執行期,發生在編譯期的是靜態繫結,也就是靜多型 發生在執行期的則是動態繫結,也就是動多型。一 靜多型可以通過模板和函式過載來實現,下面舉兩個例子 1 函式模板 template t max c...

C 中的多型

定義 同樣的訊息被不同型別的物件接收時產生不同的行為。原理 1.編譯時多型 靜態繫結 2.執行時多型 動態繫結 分類 1.過載 包括函式過載,運算子過載 靜態繫結 2.覆蓋 包括子類和父類間虛函式 虛析構函式和純虛函式 動態繫結 要求 1.函式名相同 2.引數不同 栗子 include using ...