多態就是字面意思, 多種型態。
這裡我學到了一個非常有用的應用。
就是當你有一個基類,想讓他的派生類進行比較排序的時候, 你會發現由於派生類的類別不一樣,你需要重載比較函數很多次,這樣寫下去會死人的。
我們可以利用多態的特性。
在基類中造出純虛函數,然後讓派生類和基類中的函數同名。
如果我們讓兩個不同派生類的基類進行比較的時候,積類會直接去找他所指向的派生類中的同名函數, 這樣就可以減少我們的代碼量。
比如: 你現在想比較很多個不同的圖形面積,裡面有矩形,圓形,三角形。
如果你要寫cmp function, 你需要寫很多次,比如矩形和原形比較,三角形和圓形比較。
但是我們可以利用多態特性進行比較。
首先, 我們創建一個共同基類,叫他做Cshape。
他有一個純虛函數成員叫 area();
我們可以弄一個指針數組,存放所有Cshape 的 指針。
Cshape * pshapes[100];
我們也會有三角形, 矩形,圓形的派生類,我們知道派生類可以放在基類數組中。
當我們呼叫Cshape[i] 的area()函數時,他會自動找出他所指向的派生類的area()函數, 這樣我們就可以忽略掉他們的屬性進行比較了,方便很多。
#include#include #include using namespace std; class CShape{ public: virtual double Area() = 0; virtual void PrintInfo() = 0; }; class CRectangle:public CShape{ public: int w, h; virtual double Area(); virtual void PrintInfo(); }; double CRectangle::Area(){ return w * h; } void CRectangle::PrintInfo(){ cout << "rectangle size : " << Area() << endl; } class CCircle:public CShape{ public: int r; virtual double Area(); virtual void PrintInfo(); }; double CCircle::Area(){ return r * r * 3.14; } void CCircle::PrintInfo(){ cout << "circle size : " << Area() << endl; } class CTriangle:public CShape{ public: int a, b,c; virtual double Area(); virtual void PrintInfo(); }; double CTriangle::Area(){ double p = (a + b + c)/2.0; return sqrt(p * (p - a) * (p - b) * (p - c)); } void CTriangle::PrintInfo(){ cout << "triangle size : " << Area() << endl; } CShape * pShapes[100]; int cmp(CShape * s1, CShape * s2){ return s1->Area() < s2->Area(); } int main(){ int n; CRectangle * pr; CCircle * pc; CTriangle * pt; cin >> n; for(int i = 0; i < n; i++){ char c; cin >> c; switch(c){ case 'R': pr = new CRectangle(); cin >> pr->w >> pr->h; pShapes[i] = pr; break; case 'C': pc = new CCircle(); cin >> pc->r; pShapes[i] = pc; break; case 'T': pt = new CTriangle(); cin >> pt->a >> pt->b >> pt->c; pShapes[i] = pt; break; } } sort(pShapes, pShapes + n, cmp); for(int i = 0; i < n; i++){ pShapes[i]->PrintInfo(); } return 0; }



