當相同的實體(函數或對象)在不同的場景中表現不同時,這在c++中被稱為多態性。c++中多態性的主題包括:
c++中的多態是什麼?
在c++中,多態性意味著相同的實體(函數或對象)在不同的場景中表現不同。
考慮下麵的例子:
c++中的“+”操作符可以在兩個不同的場景中執行兩個特定的功能,例如,當“+”操作符用於數字時,它執行加法。
Int a = 6;Int b = 6;Int sum = a + b;// sum =12
並且在字符串中使用相同的“+”操作符,它執行連接。
string firstName = "Great ";string lastName = "Learning";// name = "beplay2018官网Great Learning " string name = firstName + lastName;
c++中的多態性類型
c++中的多態性分為兩種類型。下圖顯示了這些類型:
1.編譯時多態
在編譯時多態性中,函數在程序編譯時被調用。我們將這種類型的多態性稱為早期綁定或靜態綁定。
函數重載和操作符重載是編譯時多態性的類型。
一、函數重載
函數重載意味著一個函數可以執行多個任務。在c++中,一個函數用於執行具有相同名稱和不同類型參數的多個任務。在函數中重載函數將在程序編譯時調用。它是編譯時多態性的一個例子。
在下麵的示例中,函數ADD()用於執行兩個任務。這兩個請求將是添加兩個整數值和添加兩個字符串(連接)。
通過函數重載來增加程序的可讀性。這是通過對相同的動作使用相同的名稱來實現的。
源代碼:
#include using namespace std;class ADD {public: int ADD(int X,int Y) //帶有參數{返回X+Y的函數;//這個函數正在執行兩個整數值的相加}int ADD(){//同名函數但沒有參數字符串a= "HELLO";字符串b =“山姆”;//在這個函數中執行連接string c= a+b;cout c < < < < endl;}};int main(void){添加對象;cout<
輸出
143
HELLOSAM
在上麵的例子中,我們使用ADD()函數來執行許多任務,這是c++中多態性的一個屬性。
2操作符重載
操作符重載意味著在不改變操作符實際含義的情況下為操作符定義額外的任務。我們通過算子函數來實現。
操作符重載的目的是為用戶定義的數據類型提供特殊的含義。
操作符重載的優點是在同一個操作數上執行不同的操作。
源代碼
#include using namespace std;類A{字符串x;public: A(){} A(字符串i) {x=i;} void操作符+(A);空白顯示();};void A:: operator+(A A){字符串m = x+ A .x;cout<<"兩個對象相加的結果是:"<
輸出
添加兩個對象的結果是:Welcomeback
2.運行時多態
在Runtime多態性中,函數是在程序執行時調用的。因此,它被稱為後期綁定或動態綁定。
函數覆蓋是運行時多態性的一部分。在函數重寫中,有多個方法具有相同的名稱和不同類型的形參列表。
它是通過使用虛函數和指針實現的。它在運行時提供了較慢的執行速度。因此,它更靈活,因為所有的事情都在運行時執行。
我。功能覆蓋
在函數重寫中,我們對派生類中的基類函數給出了新的定義。那時,我們可以說基函數已經被覆蓋了。它隻能在“派生類”中實現。在函數重寫中,同一個函數有兩個定義,一個在超類中,一個在派生類中。決定需要調用哪個函數定義發生在運行時.這就是我們稱之為“運行時多態性”的原因。
源代碼
#include using namespace std;class Animal {public: void function(){cout<<"Eating…"<
輸出
吃……
走……
2虛函數
virtual函數由virtual關鍵字聲明。虛函數的返回類型可以是int, float, void。
虛函數是基類中的成員函數。我們可以在派生類中重新定義它。它是運行時多態性的一部分。virtual函數的聲明必須在基類中,使用virtual關鍵字。虛函數不是靜態的。
虛函數幫助告訴編譯器對函數執行動態綁定或後期綁定。
如果需要使用一個指針來引用所有不同類的對象。這是因為我們必須創建一個指向基類的指針,它引用所有派生對象。
但是,當基類指針包含派生類地址時,對象總是執行基類函數。為了解決這個問題,我們使用虛函數。
聲明虛函數時,編譯器將決定在運行時調用哪個函數。
讓我們通過下麵的例子來理解在沒有虛函數和有虛函數的情況下程序是如何執行的。
源代碼
//沒有虛函數#include using namespace std;class Add {int x=5, y=20;public: void display() //覆蓋的函數{cout << " x的值是:" << x+y<display(); // Accessing the function by using base class pointer return 0; }
輸出
x的值為:25
用於在程序中調用派生類的虛函數。
源代碼
#include using namespace std;類添加{public: virtual void print () {int a=20, b=30;cout<< "基類Action是:"<print(); // Non-virtual function, binded at compile time aptr->show(); return 0; }
輸出
派生類訴訟:10
顯示基類
純虛函數
當函數沒有定義時,我們稱這種函數為“無為函數”或“純虛函數”。此函數的聲明發生在沒有定義的基類中。
源代碼
#include using namespace std;class Animal {public: virtual void show() = 0;//純虛函數聲明。};class Man: public Animal {public: void show() {cout <<“人是畜牧業的一部分”<< endl;}};int main(){動物*aptr;//基類指針//Animal a;人米;//派生類對象的創建。 aptr = &m; aptr->show(); return 0; }
輸出
人是畜牧業的一部分
運行時和編譯時的區別
運行時 | 編譯時 |
1)運行時間是可執行代碼運行的時間段。 2)隻有在程序執行後才能檢測到錯誤。 3)在程序執行過程中發生的錯誤稱為運行時錯誤。編譯器不會檢測到運行時錯誤。 |
1)編譯時間是輸入的代碼轉換為可執行代碼的時間段。 2)在程序執行前檢測錯誤。 3)在編譯時發生的錯誤稱為編譯時錯誤。兩種編譯時錯誤區域) A)當語句對編譯器沒有意義時,就會發生語義錯誤。 b)當程序員不遵循語法時發生語法錯誤。 |
c++中多態性的實時示例
當我們將主題與實時示例進行比較時,就可以清楚地理解主題。
讓我們討論c++中多態性的幾個實時示例
- 一個人可以同時扮演不同的角色和責任。女人在生活中扮演多種角色,如母親、妻子、女兒、兒媳、姐妹等。
- 男人在辦公室裏表現得像雇員,在家裏表現得像兒子或丈夫,在商場裏表現得像顧客等等。
- 手機是一種設備,但提供了各種功能,如相機,收音機等。
c++運行時多態性示例
#include using namespace std;class Animal {public: void eat(){cout<<"Eating";}};類山羊:公共動物{公共:無效吃(){cout<<“吃草”;}};int main(void){山羊g =山羊();g.eat ();返回0;}
輸出
帶有數據成員的運行時多態性示例
#include using namespace std;class Animal{類聲明。public: string color = "White";};兔子:公共動物動物類。{public: string color = "pink";};int main(無效){動物r=兔子();cout < < r.color;}
輸出
使用兩個派生類的運行時多態性示例
#include using namespace std;類Polygon {public: virtual void show() {cout<<"這是一個多邊形"<show(); P = &p; P->show(); return 0; }
輸出
至此,關於c++中的多態性的博客就結束了。希望這能幫助你提高你的c++技能。要了解更多關於編程和其他相關概念的知識,請查看有關的課程beplay2018官网偉大的學習學院.
此外,如果你正在準備麵試,看看這些c++麵試問題像專業人士一樣打滿分。