多型指的是同乙個行為,有不同的表現形式,在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 ...