代碼示例
#include
using namespace std;
class Animal {
private:
int age;
protected:
int id;
public:
int height;
void sayHi() { cout << "this is hello" << endl; }
};
class People : public Animal {
private:
int aa;
protected:
int cc;
public:
int height; // 遮蔽基類 height
void sayHi() { cout << "people say hi" << endl; } // 覆蓋
};
int main() {
People pp;
pp.height = 100; // 派生類 public height
pp.id = 200; // 基類 protected → 派生類可訪問
pp.cc = 200; // 派生類 protected
// pp.age = 10; // 錯誤:基類 private 不可訪問
// pp.aa = 10; // 錯誤:派生類 private 不可訪問
pp.sayHi(); // 調用派生類版本
pp.Animal::sayHi(); // 顯式調用基類版本
return 0;
}
運行結果
people say hi
this is hello
關鍵知識點總結
| 基類成員 | public 繼承後訪問性 | 派生類內部可訪問 | 主程序可訪問 |
| public | public | 是 | 是 |
| protected | protected | 是 | 否 |
| private | 不可訪問(但佔內存) | 否 | 否 |
- 同名遮蔽:派生類成員遮蔽基類同名成員,需用
Base::member 訪問基類版本
- 覆蓋 vs 遮蔽:虛函數為覆蓋(多態),非虛函數為遮蔽(靜態綁定)
- 構造順序:基類構造 → 成員構造 → 派生類構造;析構順序相反
- 賦值兼容:派生類指針/引用可隱式轉換為基類指針/引用(public 繼承)
內存佈局圖解
People 對象內存:
+------------------+
| Animal::age | (private, 不可直接訪問)
| Animal::id | (protected)
| Animal::height | (public)
| People::aa | (private)
| People::cc | (protected)
| People::height | (public, 遮蔽基類 height)
+------------------+