栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 多態筆記

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 多態筆記

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

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

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

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

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

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/994496.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号