C++ 类中的3种访问权限和继承方式
访问权限:public 可以被任意实体访问,protected 只允许子类(无论什么继承方式)及本类的成员函数访问,private 只允许本类的成员函数访问。三种继承方式分别是 public 继承,protect 继承,private 继承。
示例程序如下:
#include <iostream>
#include <String>
using namespace std;
// 基类
class student
{
public:
string name;
protected:
int age;
private:
char sex;
public:
void showStu()
{
cout << this->name << endl; // 1、在本类能够访问类的公有数据成员
cout << this->age << endl; // 1、在本类能够访问类的保护数据成员
cout << this->sex << endl; // 1、在本类能够访问类的私有数据成员
}
};
// 派生类 - public继承
class public_Sub : public student
{
public:
void show()
{
cout << this->name << endl; // 2、public继承,在派生类中能够访问基类的公有数据成员
cout << this->age << endl; // 2、public继承,在派生类中能够访问基类的保护数据成员
//cout << this->sex << endl; // error:2、在c类中不能访问基类的私有数据成员
}
};
// 派生类 - protected继承
class protected_Sub : protected student
{
public:
void show()
{
cout << this->name << endl; // 3、protected继承,在派生类中能够访问基类的公有数据成员
cout << this->age << endl; // 3、protected继承,在派生类中能够访问基类的保护数据成员
//cout << this->sex << endl; // error:3、在派生类中不能访问基类的私有数据成员
}
};
// 派生类 - private继承
class private_Sub : private student
{
public:
void show()
{
cout << this->name << endl; // 4、private继承,在派生类中能够访问基类的公有数据成员
cout << this->age << endl; // 4、private继承,在派生类中能够访问基类的保护数据成员 【即使是private继承】
//cout << this->sex << endl; // error:4、在派生类中不能访问基类的私有数据成员
}
};
int main()
{
student stu;
cout << stu.name << endl; // 5、在类外可以访问类的公有数据成员
//cout << stu.age << endl; // error,5、在类外不能访问类的保护数据成员
//cout << stu.sex << endl; // error,5、在类外不能访问类的私有数据成员
return 0;
}
- 派生类内不管是 public、protected、private 继承,总是可以 public、protected 成员,基类中的 private 成员永远不能再派生类内直接访问,不论通过哪种方式。
- 派生类对象仅当 public 派生时,对基类中的 public 成员有可访问/可修改的权限,其他都为不可访问/不可修改。
另外,继承方式会改变从基类继承的成员在派生类的访问权限:
1、public 继承不改变基类成员的访问权限;
2、protected 继承将基类中 public 成员变为子类的 protected 成员,其它成员的访问权限不变;
3、private 继承使得基类所有成员在子类中的访问权限变为 private。
C++ 中为什么要定义 public、protect、private 这三种访问权限?
有些我们需要给外面看的,也就是对外接口,那么就是 public。如果我们不想让别人知道内部的实现细节,那么就是 private。如果我们不想让别人知道,想让自己的孩子什么的知道(这里涉及到继承),那么就可以作为 protected。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!