C++中protected,private,public三者的區(qū)別詳解
一、訪問權限(最核心區(qū)別)
| 訪問限定符 | 類內(成員函數)可訪問 | 派生類可訪問 | 類外(對象)可訪問 |
|---|---|---|---|
public | ? | ? | ? |
protected | ? | ? | ? |
private | ? | ? | ? |
private最封閉,protected只對子類開放,public對所有人開放。
二、示例:類內、子類、外部訪問
#include <iostream>
class Base {
public:
int pub = 1; // 公開成員
protected:
int prot = 2; // 受保護成員
private:
int priv = 3; // 私有成員
};
class Derived : public Base {
public:
void show() {
std::cout << pub << "\n"; // ? 可訪問
std::cout << prot << "\n"; // ? 可訪問(protected對子類可見)
// std::cout << priv << "\n"; // ? 不可訪問(private對子類隱藏)
}
};
int main() {
Base b;
Derived d;
std::cout << b.pub << "\n"; // ? public 對外可訪問
// std::cout << b.prot << "\n"; // ? protected 不可外部訪問
// std::cout << b.priv << "\n"; // ? private 不可外部訪問
}
三、繼承時的訪問級別變化
繼承時,父類成員會因為繼承方式不同而改變可見性。
(?? 這點容易混)
| 繼承方式 | 父類的 public 成員在子類中變成 | 父類的 protected 成員在子類中變成 | 父類的 private 成員 |
|---|---|---|---|
public 繼承 | public | protected | 不可訪問 |
protected 繼承 | protected | protected | 不可訪問 |
private 繼承 | private | private | 不可訪問 |
舉例:
class Base {
public:
int a;
protected:
int b;
private:
int c;
};
class Derived1 : public Base {};
class Derived2 : protected Base {};
class Derived3 : private Base {};
| 成員 | Derived1中訪問級別 | Derived2中訪問級別 | Derived3中訪問級別 |
|---|---|---|---|
| a(public) | ? public | ? protected | ? private |
| b(protected) | ? protected | ? protected | ? private |
| c(private) | ? 不可訪問 | ? 不可訪問 | ? 不可訪問 |
四、實際應用場景舉例
| 關鍵字 | 典型用法 | 場景說明 |
|---|---|---|
public | 對外提供接口 | 類的外部接口函數(如 getter/setter、API) |
protected | 給子類繼承用 | 父類希望子類能訪問但外部不能(模板方法、基類輔助函數) |
private | 封裝內部實現(xiàn) | 數據成員、工具函數,不希望外界訪問 |
示例:封裝與繼承
class Animal {
public:
void eat() { std::cout << "eat\n"; } // 公共接口
protected:
void breathe() { std::cout << "breathe\n"; } // 子類能用
private:
void think() { std::cout << "think\n"; } // 僅自己能用
};
class Dog : public Animal {
public:
void run() {
eat(); // ? 繼承自public
breathe(); // ? 繼承自protected
// think(); // ? 無法訪問
}
};
五、總結口訣
| 限定符 | 誰能訪問 | 常用位置 | 用途 |
|---|---|---|---|
public | 所有人 | 類接口 | 提供功能 |
protected | 自己 + 子類 | 基類方法 | 繼承擴展 |
private | 僅自己 | 數據成員 | 封裝隱藏 |
口訣:
public 人人能看,
protected 兒孫能看,
private 自家能看。
protected 用來干嘛?
用來讓基類保留“對子類開放”的接口,而仍然對外部隱藏。
比如虛函數模板方法模式(Template Method)。
在模板方法模式中,父類定義流程,子類填細節(jié)。
控制繼承范圍:讓子類訪問內部工具函數。
防止外部直接創(chuàng)建或銷毀資源
類之間的協(xié)作,如框架開發(fā)。
class Widget {
public:
void draw(); // 對外接口
protected:
virtual void paint(); // 由子類重寫的繪制邏輯
};public / protected / private 繼承的區(qū)別?
影響的是基類成員在派生類中的訪問級別,而不是繼承數量。
總結
到此這篇關于C++中protected,private,public三者區(qū)別的文章就介紹到這了,更多相關protected,private,public區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
c++如何控制對象的創(chuàng)建方式(禁止創(chuàng)建棧對象or堆對象)和創(chuàng)建的數量
這篇文章主要介紹了c++如何控制對象的創(chuàng)建方式和創(chuàng)建的數量,幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-08-08
VC++中HTControl的CHTButton按鈕控件類用法實例解析
這篇文章主要介紹了VC++中HTControl的CHTButton按鈕控件類用法,對于大家進行VC++項目開發(fā)有一定的幫助作用,需要的朋友可以參考下2014-08-08

