1樓:才清雅
由於dog是animal的子類,而animal的gettype() 和 getvoice() 都是虛函式,而實現了多型性,而void type(animal &a)函式 中的引數是animal的引用物件,由於animal是dog的父類,而父類的物件可以接收子類的物件,所以當呼叫type(d);這個函式時,type(animal &a)函式中的&a就是d的別名,也就是說a中的位址和d的位址相同,所以能實行多型性,void type(animal &a) 所以這裡a.gettype();呼叫的是dog的成員函式. void speak(animal a) 這函式由於a是animal的物件,位址也是animal類的,,由於animal是dog的父類,而父類的物件可以接收子類的物件,但是由於a是animal的物件,當d做為引數內賦給a時,會呼叫anima的複製建構函式來用物件d來初始化a的成員變數,所以a的位址還是animal類的,所以void speak(animal a) 這裡的a.
getvoice()呼叫的是anima的成員函式. 本人菜鳥見解,高手勿噴!
2樓:赤丶果果
oid type(animal &a) // 函式引數: animal 類引用物件a void speak(animal a) //這裡上下兩行有什麼區別? animal類物件a 區別在於引數的傳值方式 第一種(animal &a) 是形參是乙個引用 它的位址與實參是相同的 又由於虛函式的特性 便會呼叫子類的方法。
而第二種(animal a)形參是乙個物件它有乙個animal類大小的位址空間,當把子類dog 類的物件傳給它時 會發生乙個擷取 取animal類位址空間能放下的部份 (dog類位址空間中存放的前面是繼承基類animal類的結構後面是自己的結構) 所以在這裡子類的部份被截掉了 也就只能呼叫基類的getvoice()方法了。
什麼是多型性,c++中是如何實現多型的
3樓:千鋒教育
c++中,實現多型有以下方法:虛函式,抽象類,覆蓋,模板(過載和多型無關)。
虛函式是指在某基類中宣告為 virtual 並在乙個或多個派生類中被重新定 義的成員函式,用法格式為:virtual 函式返回型別 函式名(參數列) ;實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。
c++為了讓乙個類成為抽象類,至少必須有乙個純虛函式。包含至少乙個純虛函式的類視為抽象類。
4樓:匿名使用者
我舉個通俗一點的例子吧,
比如生物是乙個類,生物類裡面包含了乙個類叫鳥類
生物*是爸爸(父類),鳥類**是兒子(子類),魚類**是二兒子(子類)。龍生九子,各不相同。
生物*的特點,兒子 鳥類**繼承了爸爸,還延伸出了乙個特點,所以鳥類**的特點是;
而魚類**也延伸出自己的特點,有,所以魚類的特點。
——————————————————
問題:這tm不是繼承性嗎?關多型性屁事?
劃重點:沒有繼承性,就不會有多型性的存在(物件導向三大特性:封裝、繼承、多型)。
多型性(基於繼承所顯示的多重特性)。所以!
只要發現了「翅膀」,人們可以立刻判斷是鳥,第二反應是它還是生物呢~~~
發現「鰓」,哦,它是魚類,第二反應,它也是生物呀~~~
————————————————————————
多型性可以快速的判斷事物本身的特點,而不用通過依賴順序判斷(先判斷是不是生物,再查詢有沒有翅膀),明明就有個「鰓」你看見了,這就是一條魚!何必多此一舉????
————————————————————————————
補充關於非多型的繼承:
舉個栗子:
父類是車,跑車是車的子類,
跑車,卡車,
ok?沒有顯示出特點,只是劃分了更精確的區間。
所以!劃重點:
——————————————————————————
多型,繼承等等是概念!概念!概念!理解這個概念,而不是片面斷裂的人為劃界限!
因為物件導向這三個特性是融合在一體的,缺一不可,缺了,就「沒物件了」,哈哈哈哈~~
什麼叫做多型性 ?在c++中是如何實現多型的?
5樓:匿名使用者
c++中的多型(雖然多型不是c++所特有的,但是c++中的多型確實是很特殊的)分為靜多型和動多型(也就是靜態繫結和動態繫結兩種現象),靜動的區別主要在於這種繫結發生在編譯期還是執行期,發生在編譯期的是靜態繫結,也就是靜多型;發生在執行期的則是動態繫結,也就是動多型。
靜多型可以通過模板和函式過載來實現(之所說c++中的多型主要還是因為模板這個東西),下面舉兩個例子:
1)函式模板
template
t max(const t& lsh, const t& rhs)
返回兩個任意型別物件的最大值(物件),前提是該型別能夠使用》運算子進行比較,並且返回值是bool型別。
使用:int a = 3; int b = 4;
cout << max(a, b) << endl;
float c = 2.4; float d = 1.2;
cout << max(c, d) << endl;
輸出結果為:
42.4
這種繫結發生在編譯期,這是由於模板的例項化是發生在編譯期的,即在編譯時編譯器發現你呼叫max(a, b)時就自動生成乙個函式
int max(const int& lsh, const int& rhs)
即將所有的t替換成int;
當你呼叫max(c, d)時就自動生成乙個函式
float max(const float& lsh, const float& rhs)
之所以說開始的函式定義是函式模板,就是因為他就像個模子似的,你可以用鋁作為原料也可以用石膏或者銅。
2)函式過載:
int max (int a, int b)
int max (int a, int b, int c)
兩個函式名稱一樣,引數型別或個數不完全相同,返回值一樣(這個不重要)。
使用:int a = 3, b = 4, c = 5;
cout << max(a, b) << endl;
cout << max(a, b, c) << endl;
輸出結果為:45
確定函式的過程也發生在編譯器,當你使用max(a, b),編譯器發現只有兩個引數,那麼就呼叫只有兩個引數的函式版本,當使用max(a, b, c)時,編譯器則使用有3個引數的版本。
通過上面的兩個例子,你還可以使用更為方便的模板函式過載:
template
t max(const t& lsh, const t& rhs)
template
t max(const t& a, const t& b, const t& c)
使用float a = 3.6, b = 1.2, c = 7.8;
cout << max(a, b, c) << endl;
輸出:7.8
通過引數個數和型別,編譯器自動生成和呼叫對應得函式版本!
動多型則是通過繼承、虛函式(virtual)、指標來實現。
class a
}class b : public a
}使用:
a a* = b();
a->func();
輸出:b::func()
編譯期是不呼叫任何函式的,編譯器編譯到a->func()時只是檢查有沒有語法問題,經過檢查沒有。編譯器並不知道呼叫的是a版本的func()還是b版本的func(),由於a是乙個指向b物件的指標,所以a只知道它指向的是乙個a型別(或者能轉換成a型別)的物件。通常整合體系就說明了(由於是公有繼承)b是一種a。
在執行期,a要呼叫a所指向物件的func()函式,就對它指向的物件下達呼叫func()的命令,結果a所指向的是乙個b物件,這個物件就呼叫了自己版本(b版)的func()函式,所以輸出時b::func()
總結:在編譯期決定你應該呼叫哪個函式的行為是靜態繫結(static-binding),這種現象就是靜多型。
在執行期決定應該呼叫哪中型別物件的函式的行為是動態繫結(dynamic-binding),這種現象就是動多型!
注:由於這是我花了有限的時間總結的,語言應用能力比較差,還有比如類模板(靜多型和動多型組合的情況)都沒有說,最近比較忙,請見諒!
如果還不是很懂,我建議你看c++primer 4th edition,講的比較清晰,但是比較零散!
什麼叫做多型性 ?在c++中是如何實現多型的?
6樓:匿名使用者
c++中的多型(雖然多型不是c++所特有的,但是c++中的多型確實是很特殊的)分為靜多型和動多型(也就是靜態繫結和動態繫結兩種現象),靜動的區別主要在於這種繫結發生在編譯期還是執行期,發生在編譯期的是靜態繫結,也就是靜多型;發生在執行期的則是動態繫結,也就是動多型。
靜多型可以通過模板和函式過載來實現(之所說c++中的多型主要還是因為模板這個東西),下面舉兩個例子:
1)函式模板
template
t max(const t& lsh, const t& rhs)
返回兩個任意型別物件的最大值(物件),前提是該型別能夠使用》運算子進行比較,並且返回值是bool型別。
使用:int a = 3; int b = 4;
cout << max(a, b) << endl;
float c = 2.4; float d = 1.2;
cout << max(c, d) << endl;
輸出結果為:
42.4
這種繫結發生在編譯期,這是由於模板的例項化是發生在編譯期的,即在編譯時編譯器發現你呼叫max(a, b)時就自動生成乙個函式
int max(const int& lsh, const int& rhs)
即將所有的t替換成int;
當你呼叫max(c, d)時就自動生成乙個函式
float max(const float& lsh, const float& rhs)
之所以說開始的函式定義是函式模板,就是因為他就像個模子似的,你可以用鋁作為原料也可以用石膏或者銅。
2)函式過載:
int max (int a, int b)
int max (int a, int b, int c)
兩個函式名稱一樣,引數型別或個數不完全相同,返回值一樣(這個不重要)。
使用:int a = 3, b = 4, c = 5;
cout << max(a, b) << endl;
cout << max(a, b, c) << endl;
輸出結果為:45
確定函式的過程也發生在編譯器,當你使用max(a, b),編譯器發現只有兩個引數,那麼就呼叫只有兩個引數的函式版本,當使用max(a, b, c)時,編譯器則使用有3個引數的版本。
通過上面的兩個例子,你還可以使用更為方便的模板函式過載:
template
t max(const t& lsh, const t& rhs)
template
t max(const t& a, const t& b, const t& c)
使用float a = 3.6, b = 1.2, c = 7.8;
cout << max(a, b, c) << endl;
輸出:7.8
通過引數個數和型別,編譯器自動生成和呼叫對應得函式版本!
動多型則是通過繼承、虛函式(virtual)、指標來實現。
class a
}class b : public a
}使用:
a a* = b();
a->func();
輸出:b::func()
編譯期是不呼叫任何函式的,編譯器編譯到a->func()時只是檢查有沒有語法問題,經過檢查沒有。編譯器並不知道呼叫的是a版本的func()還是b版本的func(),由於a是乙個指向b物件的指標,所以a只知道它指向的是乙個a型別(或者能轉換成a型別)的物件。通常整合體系就說明了(由於是公有繼承)b是一種a。
在執行期,a要呼叫a所指向物件的func()函式,就對它指向的物件下達呼叫func()的命令,結果a所指向的是乙個b物件,這個物件就呼叫了自己版本(b版)的func()函式,所以輸出時b::func()
總結:在編譯期決定你應該呼叫哪個函式的行為是靜態繫結(static-binding),這種現象就是靜多型。
在執行期決定應該呼叫哪中型別物件的函式的行為是動態繫結(dynamic-binding),這種現象就是動多型!
注:由於這是我花了有限的時間總結的,語言應用能力比較差,還有比如類模板(靜多型和動多型組合的情況)都沒有說,最近比較忙,請見諒!
如果還不是很懂,我建議你看c++primer 4th edition,講的比較清晰,但是比較零散!
什麼是染色體多型性
染色體的多型性又稱異態性 heteromorphi 是指正常人群中經常可見到各種染色體形態的微小變異。這種變異主要表現為同源染色體大小形態或著色等方面的變異。多型性是可遺傳的,並且通常僅涉及一對同源染色體中的乙個。例如表現的d和g組的隨體增大 重複 雙隨體 或缺如,短臂的長短,1 9 16號染色體的...
c物件導向程式設計的多型性有什麼用,C 物件導向程式設計的多型性有什麼用
多型是所有語言都是一樣的,c 和別的語言沒有什麼不同主要是子類繼承父類,並重寫父類的方法,實現了不同的操作比如 public class 父類 public class 子類1 父類 public class 子類2 父類 應用 父類 a new 子類1 console.write a.m a ne...
什麼是物件導向的多型性,什麼叫做物件導向的 多型性???
多型是所有語言都是一樣的,c 和別的語言沒有什麼不同主要是子類繼承父類,並重寫父類的方法,實現了不同的操作比如 public class 父類 public class 子類1 父類 public class 子類2 父類 應用 父類 a new 子類1 console.write a.m a ne...