多態就是字面意思, 多種型態。
這裡我學到了一個非常有用的應用。
就是當你有一個基類,想讓他的派生類進行比較排序的時候, 你會發現由於派生類的類別不一樣,你需要重載比較函數很多次,這樣寫下去會死人的。
我們可以利用多態的特性。
在基類中造出純虛函數,然後讓派生類和基類中的函數同名。
如果我們讓兩個不同派生類的基類進行比較的時候,積類會直接去找他所指向的派生類中的同名函數, 這樣就可以減少我們的代碼量。
比如: 你現在想比較很多個不同的圖形面積,裡面有矩形,圓形,三角形。
如果你要寫cmp function, 你需要寫很多次,比如矩形和原形比較,三角形和圓形比較。
但是我們可以利用多態特性進行比較。
首先, 我們創建一個共同基類,叫他做Cshape。
他有一個純虛函數成員叫 area();
我們可以弄一個指針數組,存放所有Cshape 的 指針。
Cshape * pshapes[100];
我們也會有三角形, 矩形,圓形的派生類,我們知道派生類可以放在基類數組中。
當我們呼叫Cshape[i] 的area()函數時,他會自動找出他所指向的派生類的area()函數, 這樣我們就可以忽略掉他們的屬性進行比較了,方便很多。
#include<iostream>
#include<cmath>
#include<algorithm>
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;
}