C++中protected,private,public三者的區(qū)別詳解
一、訪問權(quán)限(最核心區(qū)別)
| 訪問限定符 | 類內(nèi)(成員函數(shù))可訪問 | 派生類可訪問 | 類外(對象)可訪問 |
|---|---|---|---|
public | ? | ? | ? |
protected | ? | ? | ? |
private | ? | ? | ? |
private最封閉,protected只對子類開放,public對所有人開放。
二、示例:類內(nèi)、子類、外部訪問
#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) | ? 不可訪問 | ? 不可訪問 | ? 不可訪問 |
四、實際應(yīng)用場景舉例
| 關(guān)鍵字 | 典型用法 | 場景說明 |
|---|---|---|
public | 對外提供接口 | 類的外部接口函數(shù)(如 getter/setter、API) |
protected | 給子類繼承用 | 父類希望子類能訪問但外部不能(模板方法、基類輔助函數(shù)) |
private | 封裝內(nèi)部實現(xiàn) | 數(shù)據(jù)成員、工具函數(shù),不希望外界訪問 |
示例:封裝與繼承
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(); // ? 無法訪問
}
};
五、總結(jié)口訣
| 限定符 | 誰能訪問 | 常用位置 | 用途 |
|---|---|---|---|
public | 所有人 | 類接口 | 提供功能 |
protected | 自己 + 子類 | 基類方法 | 繼承擴展 |
private | 僅自己 | 數(shù)據(jù)成員 | 封裝隱藏 |
口訣:
public 人人能看,
protected 兒孫能看,
private 自家能看。
protected 用來干嘛?
用來讓基類保留“對子類開放”的接口,而仍然對外部隱藏。
比如虛函數(shù)模板方法模式(Template Method)。
在模板方法模式中,父類定義流程,子類填細節(jié)。
控制繼承范圍:讓子類訪問內(nèi)部工具函數(shù)。
防止外部直接創(chuàng)建或銷毀資源
類之間的協(xié)作,如框架開發(fā)。
class Widget {
public:
void draw(); // 對外接口
protected:
virtual void paint(); // 由子類重寫的繪制邏輯
};public / protected / private 繼承的區(qū)別?
影響的是基類成員在派生類中的訪問級別,而不是繼承數(shù)量。
總結(jié)
到此這篇關(guān)于C++中protected,private,public三者區(qū)別的文章就介紹到這了,更多相關(guān)protected,private,public區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++如何控制對象的創(chuàng)建方式(禁止創(chuàng)建棧對象or堆對象)和創(chuàng)建的數(shù)量
這篇文章主要介紹了c++如何控制對象的創(chuàng)建方式和創(chuàng)建的數(shù)量,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08
C語言不用鏈表完成學(xué)生管理系統(tǒng)(完整代碼)
這篇文章主要介紹了C語言不用鏈表完成學(xué)生管理系統(tǒng)(完整代碼),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
VC++中HTControl的CHTButton按鈕控件類用法實例解析
這篇文章主要介紹了VC++中HTControl的CHTButton按鈕控件類用法,對于大家進行VC++項目開發(fā)有一定的幫助作用,需要的朋友可以參考下2014-08-08

