C++中protected,private,public三者的区别详解
目录
- 一、访问权限(最核心区别)
- 二、示例:类内、子类、外部访问
- 三、继承时的访问级别变化
- 举例:
- 四、实际应用场景举例
- 示例:封装与继承
- 五、总结口诀
- protected 用来干嘛?
- 总结
一、访问权限(最核心区别)
| 访问限定符 | 类内(成员函数)可访问 | 派生类可访问 | 类外(对象)可访问 |
|---|---|---|---|
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 | 封装内部实现 | 数据成员、工具函数,不希望外界访问 |
示例:封装与继承
class Animal {
public:
void eat() { std::cout << "eat\n"; } // 公共接口
protected:
void breathe() { std::cout << "breathe\n"; } // 子类能用
prpythonivate:
void think() { std::cout <<编程 "thinwww.devze.comk\n"; } // 仅自己能用
};
class Dog : public Animal {
public:
void run() {
eat(); // ✅ 继承自public
breathe(); // ✅ 继承自protected
// think(); // ❌ 无法访问
}
};
五、总结口诀
| 限定符 | 谁能访问 | 常用位置 | 用途 |
|---|---|---|---|
public | 所有人 | 类接口 | 提供功能 |
protected | 自己 + 子类 | 基类方法 | 继承扩展 |
private | 仅自己 | 数据成员 | 封装隐藏 |
口诀:
public 人人能看,
protected 儿孙能看,private 自家能看。
protected 用来干嘛?
用来让基类保留“对子类开放”的接口,而仍然对外部隐藏http://www.devze.com。
比如虚函数模板方法模式(Template Method)。
在模板方法模式中,父类定义流程,子类填细节。
控制继承范围:让子类访问内部工具函数。防止外部直接创建或销毁资http://www.devze.com源
类之间的协作,如框架开发。
class Widget {
public:
void draw(); // 对外接口
protected:
virtual void paint(); // 由子类重写的绘制逻辑
};
public / protected / private 继承的区别?
影响的是基类成员在派生类中的访问级别,而不是继承数量。
总结
到此这篇关于C++中protected,private,public三者区别的文章就介绍到这了,更多相关protected,private,public区别内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论