# 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`