網(wǎng)站建設waocc百度 seo優(yōu)化作用
多態(tài)的概念
多態(tài)的概念:通俗來說,就是多種形態(tài), 具體點就是去完成某個行為,當不同的對象去完成時會 產(chǎn)生出不同的狀態(tài) 。 舉個例子:比如 買票這個行為
,當 普通人 買票時,是全價買票; 學生 買票時,是半價買票; 軍人 買票時是優(yōu)先買票。 再舉個栗子: 最近為了 爭奪在線支付市場
,支付寶年底經(jīng)常會做誘人的 掃紅包 - 支付 - 給獎勵金 的 活動。那么大家想想為什么有人掃的紅包又大又新鮮 8 塊、 10 塊 …
,而有人掃的紅包都是 1 毛, 5 毛 … 。其實這背后也是一個多態(tài)行為。支付寶首先會分析你的賬戶數(shù)據(jù),比如你是新用戶、比如
你沒有經(jīng)常支付寶支付等等,那么你需要被鼓勵使用支付寶,那么就你掃碼金額 = random()%99
;比如你經(jīng)常使用支付寶支付或者支付寶賬戶中常年沒錢,那么就不需要太鼓勵你 去使用支付寶,那么就你掃碼金額 = random()%1
;總結一下: 同樣是掃碼動作,不同的用戶掃 得到的不一樣的紅包,這也是一種多態(tài)行為。 ps :支付寶紅包問題純屬瞎編,大家僅供娛樂。
總結:多態(tài)是在不同繼承關系的類對象,去調(diào)用同一函數(shù),產(chǎn)生了不同的行為。比如 Student 繼承了 Person。 Person
對象買票全價, Student 對象買票半價。
多態(tài)按字面的意思就是多種形態(tài)。當類之間存在層次結構,并且類之間是通過繼承關聯(lián)時,就會用到多態(tài)。
C++ 多態(tài)意味著調(diào)用成員函數(shù)時,會根據(jù)調(diào)用函數(shù)的對象的類型來執(zhí)行不同的函數(shù)。
下面的實例中,基類 Shape 被派生為兩個類,如下所示:
實例
#include <iostream>
using namespace std;class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}int area(){cout << "Parent class area :" <<endl;return 0;}
};
class Rectangle: public Shape{public:Rectangle( int a=0, int b=0):Shape(a, b) { }int area (){ cout << "Rectangle class area :" <<endl;return (width * height); }
};
class Triangle: public Shape{public:Triangle( int a=0, int b=0):Shape(a, b) { }int area (){ cout << "Triangle class area :" <<endl;return (width * height / 2); }
};
// 程序的主函數(shù)
int main( )
{Shape *shape;Rectangle rec(10,7);Triangle tri(10,5);// 存儲矩形的地址shape = &rec;// 調(diào)用矩形的求面積函數(shù) areashape->area();// 存儲三角形的地址shape = &tri;// 調(diào)用三角形的求面積函數(shù) areashape->area();return 0;
}
當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結果:
Parent class area :
Parent class area :
導致錯誤輸出的原因是,調(diào)用函數(shù) area() 被編譯器設置為基類中的版本,這就是所謂的靜態(tài)多態(tài),或靜態(tài)鏈接 - 函數(shù)調(diào)用在程序執(zhí)行前就準備好了。有時候這也被稱為早綁定,因為 area() 函數(shù)在程序編譯期間就已經(jīng)設置好了。
但現(xiàn)在,讓我們對程序稍作修改,在 Shape 類中,area() 的聲明前放置關鍵字 virtual,如下所示:
class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}virtual int area(){cout << "Parent class area :" <<endl;return 0;}
};
修改后,當編譯和執(zhí)行前面的實例代碼時,它會產(chǎn)生以下結果:
Rectangle class area :
Triangle class area :
此時,編譯器看的是指針的內(nèi)容,而不是它的類型。因此,由于 tri 和 rec 類的對象的地址存儲在 *shape 中,所以會調(diào)用各自的 area() 函數(shù)。
正如所看到的,每個子類都有一個函數(shù) area() 的獨立實現(xiàn)。這就是多態(tài)的一般使用方式。有了多態(tài),可以有多個不同的類,都帶有同一個名稱但具有不同實現(xiàn)的函數(shù),函數(shù)的參數(shù)甚至可以是相同的。
虛函數(shù)
虛函數(shù) 是在基類中使用關鍵字 virtual 聲明的函數(shù)。在派生類中重新定義基類中定義的虛函數(shù)時,會告訴編譯器不要靜態(tài)鏈接到該函數(shù)。
我們想要的是在程序中任意點可以根據(jù)所調(diào)用的對象類型來選擇調(diào)用的函數(shù),這種操作被稱為動態(tài)鏈接,或后期綁定。
純虛函數(shù)
可能想要在基類中定義虛函數(shù),以便在派生類中重新定義該函數(shù)更好地適用于對象,但是在基類中又不能對虛函數(shù)給出有意義的實現(xiàn),這個時候就會用到純虛函數(shù)。
我們可以把基類中的虛函數(shù) area() 改寫如下:
class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}// pure virtual functionvirtual int area() = 0;
};
= 0 告訴編譯器,函數(shù)沒有主體,上面的虛函數(shù)是純虛函數(shù)。