C++筆記 第五十二課 C++中的抽象類和介面---狄泰學院
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第五十二課 C++中的抽象類和介面
1.什麼是抽象類?
面向物件中的抽象概念
在進行面向物件分析時,會發現一些抽象的概念!圖形的面積如何計算?
在現實中需要知道具體的圖形型別才能求面積,所以對概念上的“圖形”求面積是沒有意義的!
Shape只是一個概念上的型別,沒有具體物件!
2.問題
Shape類有必要存在嗎?
3.什麼是抽象類?
面向物件中的抽象類
可用於表示現實世界中的抽象概念
是一種只能定義型別,而不能產生物件的類
只能被繼承並重寫相關函式
直接特徵是關於函式沒有完整的實現
4.面向物件中的抽象類
Shape是現實世界中各種圖形的抽象概念
因此
程式中必須能夠反映抽象的圖形
程式中通過抽象類表示圖形的概念
抽象類不能建立物件,只能用於繼承
5.抽象類與純虛擬函式
C++語言中沒有抽象類的概念
C++中通過純虛擬函式實現抽象類
純虛擬函式是指只定義原型的成員函式
一個C++類中存在純虛擬函式就成為了抽象類
純虛擬函式的語法規則
“=0”用於告訴編譯器當前是宣告純虛擬函式,因此不需要定義函式體。
52-1 抽象類初探(**)—認真理解
#include <iostream> #include <string> using namespace std; class Shape { public: virtual double area() = 0; }; class Rect : public Shape { int ma; int mb; public: Rect(int a, int b) { ma = a; mb = b; } double area() { return ma * mb; } }; class Circle : public Shape { int mr; public: Circle(int r) { mr = r; } double area() { return 3.14 * mr * mr; } }; void area(Shape* p) { double r = p->area(); cout << "r = " << r << endl; } int main() { Rect rect(1,2); Circle circle(10); area(&rect); area(&circle); return 0; } 執行結果: r = 2 r = 314
程式分析:
同一條呼叫語句,不同的呼叫結果,顯示了多型的特性,抽象類不能夠定義特別的物件,但是可以定義抽象的指標,對應的指標指向抽象類的子類,抽象類的子類肯定會把純虛擬函式實現,因此通過抽象類的指標來呼叫純虛擬函式的語句是可以編譯通過,沒有問題的。
得到的結論:
抽象類智慧用作父類被繼承
子類必須實現純虛擬函式的具體功能
純虛擬函式被實現後成為虛擬函式
如果子類沒有實現純虛擬函式,則子類成為抽象類
滿足下面條件的C++類則成為介面—三個條件
類中沒有定義任何的成員變數
所有的成員函式都是公有的
所有的成員函式都是純虛擬函式
介面是一種特殊的抽象類
52-2 介面初探
#include <iostream> #include <string> using namespace std; class Channel { public: virtual bool open() = 0; virtual void close() = 0; virtual bool send(char* buf, int len) = 0; virtual int receive(char* buf, int len) = 0; }; int main() { return 0; }
小結
抽象類用於描述現實世界中的抽象概念
抽象類只能被繼承不能建立物件
C++中沒有抽象類的概念
C++中通過純虛擬函式實現抽象類
類中只存在純虛擬函式時成為介面
介面是一種特殊的抽象類