談到物件導向會提到三大基本概念:繼承(Inheritance)、封裝(Encapsulation)、多型(Polymorphism)。
本篇就稍微紀錄一下簡單的解釋,未來會依理解程度慢慢增加……
繼承(Inheritance)
繼承的概念就如同字面意思。如果拿很經典的動物例子舉例的話,每個動物幾乎都需要吃和睡覺,因此我們可以宣告一個類別叫做 Animal
,狗這個動物是除了吃和睡覺以外還會吠叫,因此繼承 Animal
之外,還多了 bark
方法。Dog
既繼承了 Animal
的 eat()
和 sleep()
,也有自己特有的 bark()
:
class Animal{ eat(); sleep(); } class Dog: public Animal{ bark(); }
另外還有一個比較容易理解的例子是計算形狀的面積。先宣告一個類別叫做 Shape
,基本屬性想設定長和寬,Shape
裡面我宣告了 width
和 height
變數。
class Shape { protected: int width; int height; public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } };
並且由 Rectangle
繼承類別,並計算它的面積。
class Ractangle: public Shape { public: int Area(){ return width * height; } };
這樣我製作一個 Rectangle 物件,就可以設定長寬並計算面積:
int main(void) { Ractangle rec1; rec1.setWidth(5); rec1.setHeight(7); cout << "Area: " << rec1.Area() << endl; return 0; }
封裝(Encapsulation)
將資料和函數放在同一種結構中,這種結構我們稱為物件。白話一點就是整包拿去用啦,不需要知道裡面是什麼,讓我們在使用上很方便。
封裝的概念下我們可以對程式碼設置權限,讓不同的物件有不同的存取限制,提高安全性。要達到這個目的,需要靠存取控制修飾子:public
、private
以及 protected
。
簡單來說就是要防止或保護資料被我們無意中破壞。
public
被宣告為 public
的成員變數或是函式,可以讓同一類別的成員存取,也可以讓別的類別或物件的成員存取。也就是說不設定任何權限,即使其他類別或是套件,都可以使用。
private
被宣告為 private
的成員變數或是函式,只能讓同一類別的成員存取,禁止讓其他類別或物件的成員存取。
不過了解後一定會有一個疑問:若只能在同一類別的成員使用,會失去物件導向最重要的精神吧。所以有一種方式,是將變數宣告為 private,再宣告一個 public 方法讓其他類別或物件的成員存取。
舉例來說我現在宣告了一個物件叫做「咖啡」,他的「咖啡豆種類」宣告為 private,再宣告一個 public 方法 make()
執行製作咖啡這個動作,並在裡面使用咖啡豆種類以及執行一些其他的製作方法。這樣的話當我們呼叫 make()
時,既可以使用到咖啡豆種類這個屬性去計算,也能夠確保咖啡豆種類不會被任意竄改。
protected
權限有點介於上方兩者之間。被宣告為 protected
的成員變數或是函式,只能讓同一個類別或是物件的成員,以及繼承於它的子物件存取,除此之外禁止讓其他物件的成員存取。
多型(Polymorphism)
這裡可以分為多載(Overloading)、覆寫(Overriding)和多型。
覆寫 Overriding
覆寫的概念在《[基礎概念] 虛擬函式 Virtual Function 是什麼東西?》有稍微提到,意思是子類別可以覆寫父類別的方法內容。
可以參考上述文章,這邊就暫時不再多寫。
多載 Overloading
簡單來說,就是一個方法,透過判斷輸入參數的型態、數量、順序,而執行不同的敘述。拿上面有出現過的例子來說好了,假設我今天有個方法叫做 Area()
,可以計算圖形的面積。而圖形的面積有不同的計算方式:
- 圓形:半徑 * 半徑 * \(\pi\)
- 長方形:長 * 寬
圓形只需要知道半徑,也就是一個參數;長方形需要知道長和寬,也就是兩個參數。我們可以呼叫同一個方法執行不同定義:
Area(4)
:判斷只有一個參數,執行計算圓面積的公式。Area(2, 5)
:判斷輸入了兩個參數,執行長方形面積的公式。
多型 Polymorphism
多型的部分可以在維基百科上的定義用兩句話解決:為不同資料類型的實體提供統一的介面,或使用一個單一的符號來表示多個不同的類型。
簡單來說應該就是上述兩個結合起來的宣告方式。