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
