C++ 抽象類與接口


1. 抽象類

 在面向對象編程中,抽象類是一種只能定義類型,不能生成對象的類,它是對一系列看上去不同,但是本質相同的具體概念的抽象。最典型的的抽象類就是”圖形”,三角形、矩形、梯形都是圖形,它們都具有邊長、面積屬性,”圖形”類是對這系列的抽象。

 程序設計中,我們可以定義一個表征圖形的類,然后具體圖形繼承該類。圖形類,即基類定義如下:

class Shape { public: double area() //求面積 { //如何求?? } };

 實際上,只要是具體圖形就有面積這個量,但是對”圖形”求面積是沒有任何意義的,只有在知道具體的圖形類型之后才能求面積。所以對”圖形”來說,area()函數無法實現,且不可讓Shape生成對象(生成對象無意義),這就需要把Shape定義成一個抽象類:把area()函數聲明為純虛函數即可:

virtual double area() = 0;

 總結什么是抽象類:其實,在c++中並沒有抽象類的概念,要實現抽象類則需要通過純虛函數實現。純虛函數指的是只定義函數原型的成員函數。在c++的類中,只要存在純虛函數,那么該類就變成抽象類。

 (1) 每個具體圖形的求面積算法不一樣,所以加上virtual關鍵字,表明該函數是虛函數,在子類中重寫時可以發生多態; 
 (2) 為對Shape類求面積無意義,所以加上”= 0”表明該函數聲明為純虛函數,不需要定義函數體。 
 (3) 抽象類不能生成對象,只能用作父類被繼承,子類必須實現純虛函數的具體功能,在子類中,父類的純虛函數被實現后就變成虛函數,當然,如果子類沒有實現父類的純虛函數,那么子類也是抽象類一個。

class shape
{
public: //純虛函數 virtual double area() = 0; }; //定義圓形類 class circle : public shape { private: int r; public: circle(int a) : r(a) {} double area() { return r * r * 3.14; } }; //定義矩形類 class rectangle : public shape { private: int x; int y; public: rectangle(int a, int b) : x(a), y(b) {} double area() { return x * y; } }; int main(void) { rectangle r(5, 6); circle c(5); printf("圓形面積為: %.2lf\n", c.area()); printf("矩形面積為: %.2lf\n", r.area()); return 0; }

 編譯運行: 
這里寫圖片描述

2. 接口

 理解了什么是抽象類后(類中含有純虛函數),理解什么是接口就簡單了。c++中接口也是一種特殊的類,需要滿足: 
 (1) 類中沒有定義任何成員變量 
 (2) 類中所有成員函數都是公有且都是純虛函數

舉例:

class deviceOp
{
public: virtual bool OpenDev() = 0; virtual void CloseDev() = 0; virtual bool WriteDev(const char* buf, int len) = 0; virtual int ReadDev(char* buf, int len) = 0; };

 接口是一種特殊的抽象類,所以抽象類具有只能被繼承不能創建對象的特征它也具備。

 

原文摘自:https://blog.csdn.net/qq_29344757/article/details/77346934


免責聲明!

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



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