C++ 多態筆記

多態就是字面意思, 多種型態。

這裡我學到了一個非常有用的應用。

就是當你有一個基類,想讓他的派生類進行比較排序的時候, 你會發現由於派生類的類別不一樣,你需要重載比較函數很多次,這樣寫下去會死人的。

我們可以利用多態的特性。

在基類中造出純虛函數,然後讓派生類和基類中的函數同名。

如果我們讓兩個不同派生類的基類進行比較的時候,積類會直接去找他所指向的派生類中的同名函數, 這樣就可以減少我們的代碼量。

比如: 你現在想比較很多個不同的圖形面積,裡面有矩形,圓形,三角形。

如果你要寫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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值