C++ 透過繼承機制讓現有類別(基類)衍生出新類別(派生類)。派生類擁有基類所有非私有成員,並可新增自身成員。繼承方式決定基類成員在派生類中的可見性。
| 繼承方式 | 關鍵字 | 基類 public → 派生類 | 基類 protected → 派生類 | 基類 private → 派生類 |
|---|---|---|---|---|
| 公有繼承 | public | public | protected | 不可存取 |
| 私有繼承 | private(預設) | private | private | 不可存取 |
| 保護繼承 | protected | protected | protected | 不可存取 |
#include <iostream>
using namespace std;
class Base {
public: int a1;
protected: int a2;
private: int a3;
};
// 公有繼承
class D1 : public Base {
public:
void test() {
a1 = 10; // ✓ public
a2 = 20; // ✓ protected
// a3 = 30; // ✗ private
}
};
class D11 : public D1 {
public:
void test() {
a1 = 5; // ✓ D1 中為 public
a2 = 6; // ✓ D1 中為 protected
// a3 = 7; // ✗
}
};
// 私有繼承
class D2 : private Base {
public:
void test() {
a1 = 8; // ✓ 變為 private
a2 = 9; // ✓ 變為 private
// a3 = 10; // ✗
}
};
class D22 : public D2 {
public:
void test() {
// a1 = 11; // ✗ D2 中為 private
// a2 = 12; // ✗
// a3 = 13; // ✗
}
};
// 保護繼承
class D3 : protected Base {
public:
void test() {
a1 = 15; // ✓ 變為 protected
a2 = 16; // ✓ 變為 protected
// a3 = 17; // ✗
}
};
class D33 : public D3 {
public:
void test() {
a1 = 18; // ✓ D3 中為 protected
a2 = 19; // ✓
// a3 = 20; // ✗
}
};
int main() {
D11 d1; d1.a1 = 1; // ✓ public 繼承鏈保持 public
// d1.a2 = 2; // ✗ protected
D22 d2;
// d2.a1 = 4; // ✗ private 繼承鏈全變 private
D33 d3;
// d3.a1 = 7; // ✗ protected 繼承鏈對外不可見
return 0;
}
private,提供 protected 存取器給派生類