C++抽象類


1.為什么要有抽象類

我們舉一個例子,程序有兩個類,橢圓Ellipse類,圓Circle類。
我們知道橢圓是包括圓的,那么我們可以使用繼承:

class Ellipse
{};
class Circle:public Ellipse
{};

然而,我們在定義各自的成員變量和成員函數時,發現兩個類的成員有很大的不同,
比如Ellipse類需要長短軸半徑,中心坐標,方向角才能確定位置,另外還包括移動橢圓,返回橢圓面積,旋轉橢圓的方法。
而Circle類只需要半徑,中心坐標,就能確定位置,旋轉方法對圓來說也是沒有意義的。
可以看出,若簡單使Circle繼承Ellipse,將使簡單的問題復雜化。

2.什么是抽象類

解決的方法是,我們可以抽象出Ellipse類,Circle類的公共部分

class BaseEllipse
{
private:
    double x;
    double y;
public:
    BaseEllipse(double a,double b):x(a),y(b){}
    virtual ~BaseEllipse(){}
    void Move(int a,int b){x=a;y=b;}
    virtual double Area() const=0;//純虛函數
};

當類聲明中有純虛函數,比如virtual double Area()=0;時,該類就是抽象類。
抽象類不能實例化,子類繼承抽象類時,必須定義純虛函數。

class Ellipse:public BaseEllipse
{
public:
    virtual double Area() const
    {
        std::cout<<"Ellipse::Area()"<<std::endl;
    }
};
class Circle:publi BaseEllipse
{
public:    
    virtual double Area() const
    {
        std::cout<<"Circle::Area()"<<std::endl;
    }
};

3.抽象類與普通基類
由上面的講解,可看出,抽象類與普通基類的區別是,
普通基類表現的是一種父子關系,比如人和學生的關系。
抽象類更像是一種接口規則的約定
比如規定了一些公共的move()方式,對人來說,移動的方式是“走”,對鳥來說,是“飛”,對魚來說,是“游”
該約定類不能實例化,所有繼承自抽象類的子類都必須覆蓋其純虛函數,迫使派生類遵循接口規則。

 參考資料:《C++ Primer.Plus》 pp.508-516


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM