# OOP - Inheritance ## :book: 介紹 --- C++為了實現重複使用程式碼(reusability),所採的方法為繼承,共分成三種繼承方式: public, protected, private。分別能夠使用的member functions, member varibles, access range(存取範圍)有所不同。 #### 繼承權限: * public: 可以在原class、繼承的class內使用,也可以在主函式裡面使用 * protected: 類似於private,可使用的變數、函式為base的public, protected內的東西,都只能在繼承的class使用 * private: 僅能在作宣告的那個class內使用,使用此權限繼承時會將base的public、protected轉成繼承的class的private PS: base為最原本的class。 繼承的class == derived class ## :book: Code Segments --- 底下就直接來看看繼承是甚麼概念吧~~ - ### Example 權限問題 ```cpp #include <iostream> using namespace std; // Base class class Base { public: int a, b; void compare(){ a > b ? cout << "a is bigger" : cout << "b is bigger"; } private: int t; }; // Derived class: public inheritance class Derived1 : public Base { public: void set(int x, int y) { a = x; b = y; } void print() { cout << "a = " << a << ", b = " << b << endl; } }; // Derived class: protected inheritance class Derived2 : protected Base { public: void set(int x, int y) { a = x; b = y; } void print() { cout << "a = " << a << ", b = " << b << endl; } }; // Derived class: private inheritance class Derived3 : private Base { public: void set(int x, int y) { a = x; b = y; } void print() { cout << "a = " << a << ", b = " << b << endl; } }; int main() { Derived1 d1; // public Derived2 d2; // protected Derived3 d3; // private d1.a = 1; d1.b = 2; d1.print(); // d1.t = 10; // d1.compare(); d2.set(3, 4); d2.print(); // d2.a = 5; // d2.compare(); d3.set(5, 6); d3.print(); // d3.a = 5; // d3.compare(); return 0; } /* * 印出: * a = 1, b = 2 * a = 3, b = 4 * a = 5, b = 6 */ ``` 想一下註解的那幾行會有甚麼error呢? :::spoiler 解答 1. d1.t: t是base的private variable,故只有base能夠使用他 2. d1.compare(): 可以正常使用,因為compare()是public且d1繼承的權限也是public 3. d2.a: d2繼承base的權限為protected,而base內沒有protected的東西,故只能使用public內的東西。 4. d2.compare(): 不可在繼承的class外作使用,因為權限為protected 5. d3.a: 不可在繼承的class外作使用,因為權限為private 6. d3.compare(): 不可在繼承的class外作使用,因為權限為private ::: >[name=罐子] ###### tags: `C++=>OOP`