当前位置: 首页 > news >正文

C++成员访问权限以及继承权限

C++中访问控制权限有三种:public, private, protected。它们的作用分为两类:

  1. 自身成员访问权限控制
    用法:
    限定关键字:成员声明
    
  2. 基类继承成员访问权限控制
    用法:
    限定关键字 基类
    

自身成员访问权限控制

在类/结构体或者联合体的成员声明序列中,它的主要作用是定义后续成员的可访问权限。例如:

class A {
public:int a;
private:int b;
protected:int c;
};struct B {
public:int a;
private:int b;
protected:int c;
};union C {
public:    int a;
private:int b;
protected:int c;
};

这里的成员包括:成员函数、成员变量、成员类型,并且不受静态、非静态限定的影响。

class A
{
public://成员函数void foo(){ }//成员变量int a;//成员类型enum AEnum{AE_1,AE_2,};
};

对成员的访问权限的控制,是站在类自身与访问对象的继承关系的视角来看的。

  • public:类内部、派生类、以及类外部都可以访问
  • protected:类内部和派生类可以访问,类外部不能访问
  • private:只有类内部可以访问
class A
{
public:// 成员函数(不管这个成员函数自身是哪种访问权限),不受访问权限限制(都是自己的部件,想怎么样就怎么样)void foo(){a = 1;b = 2;c = 3;}public:int a;protected:int b;private:int c;
};class B : public A
{
public:// "is a" 关系,继承A类,子类可以访问基类public和protected成员,不能访问基类private成员void bar(){a = 1;b = 2;// c = 3; 共有继承,子类不能访问基类private成员}
};class C
{
public:// "has a" 关系,包含一个A类的对象,但是不是继承关系,仅能访问public限定的成员void tar(){a.a = 1;// a.b = 2; // 非成员函数不能访问保护成员// a.c = 3; // 非成员函数不能访问私有成员}private:A a;
};void zar()
{A a;a.a = 1;// a.b = 2; // 非成员函数不能访问保护成员// a.c = 3; // 非成员函数不能访问私有成员
}

基类继承成员访问权限控制

在派生类的声明中,修饰派生类对基类的继承方式。具体指什么呢?就是指修饰派生类继承基类的成员访问权限。如下面的例子:

class Grandfather
{
public:int a;protected:int b;private:int c;
};class Father : public Grandfather
{
};class Son : public Father
{
public:// 成员函数void accessMyFatherMember(){a = 1; // public 权限访问b = 2; // protected 权限访问// c = 3; private权限,无权限访问}
};// 非成员函数
void foo()
{Son s;s.a = 1; // public 权限访问//s.b = 2; protected权限,无权限访问//s.c = 3; private权限,无权限访问
}

如果父类是protected继承呢?

class Father : protected Grandfather
{
};class Son : public Father
{
public:// 成员函数void accessMyFatherMember(){a = 1; // 降级为protected访问b = 2; // protected 权限访问// c = 3; private权限,无权限访问}
};// 非成员函数
void foo()
{Son s;//s.a = 1; // 降级为protected访问,无权限访问//s.b = 2; protected 权限,无权限访问//s.c = 3; private权限,无权限访问
}

如果父类是private继承呢?

class Father : private Grandfather
{
};class Son : public Father
{
public:// 成员函数void accessMyFatherMember(){//a = 1; 降级为private权限,无权限访问//b = 2; 降级为private权限,无权限访问//c = 3; private权限,无权限访问}
};// 非成员函数
void foo()
{Son s;//s.a = 1; 降级为private权限,无权限访问//s.b = 2; 降级为private权限,无权限访问//s.c = 3; private权限,无权限访问
}

通过上面的3种继承权限,可以看出,规则是:

  • 共有继承:在访问说明符后列出的基类的公有成员和受保护成员,在派生类中保持其原有的成员访问权限。
  • 保护继承:访问说明符后列出的基类的公有成员和保护成员将成为派生类的保护成员。
  • 私有继承:访问说明符后列出的基类的公开和受保护成员将成为派生类的私有成员。

基类的私有成员始终对派生类不可访问,无论采用公有、受保护还是私有继承方式。

默认继承权限

  • 如果类成员没有显式指定访问权限,则默认为私有权限。
  • 如果派生类没有显式指定继承权限,则默认为私有继承。
  • 为了兼容C的struct的成员访问权限,如果类成员没有显式指定访问权限,则默认为公有权限。
http://www.jsqmd.com/news/342049/

相关文章:

  • 数据驱动,安全可控:2026年企业智能BI私有化部署实力厂商推荐指南 - 品牌2025
  • 浙江餐饮业擦手纸推荐品牌 - 中媒介
  • 2026 AIGC 降重实用软件推荐(免费 + 高性价比)
  • 学习SQL心得
  • 2026户外微型水质在线监测系统(监测站)行业深度解析与优质厂家全景推荐 - 品牌推荐大师
  • 抗噪4键触摸感应玩具触摸芯片VK36N4B抗干扰4通道触摸芯片原厂提供技术支持
  • 学霸同款9个降AI率网站,千笔·降AIGC助手帮你精准降AIGC
  • 贴身定制,敏捷响应:2026年更懂本地化需求的BI部署方案商推荐名单 - 品牌2025
  • 2026年深圳到兰州整车运输公司推荐:到济南整车运输/到成都整车运输/到长沙整车运输/到福州整车运输/到西宁整车运输精选 - 品牌推荐官
  • gRPC C++ 快速编译与上手
  • STM32启动文件
  • 老字号制药企业有哪些?十大国民老厂盘点,藏着国人的健康底气 - 博客万
  • 2026年工业货架选购指南:性价比与品质如何兼得 - 2026年企业推荐榜
  • ‌商用擦手纸品牌排行 - 中媒介
  • 专精于一处,极致于体验:2026年深度集成的Deepseek知识库部署服务商精选推荐 - 品牌2025
  • 解锁智能问答与知识挖掘:2026年度值得关注的AI知识库方案商推荐 - 品牌2025
  • USACO历年白银组真题解析 | 2026年1月
  • ‌Naya是做什么的 - 中媒介
  • 生物柴油测硫仪,究竟哪个厂家的口碑好? - 品牌推荐大师
  • 深度测评 9 个降AI率工具 千笔轻松降AIGC
  • 探秘缅甸柚木中式装修全屋定制:定义奢华高端家居新标准 - 博客万
  • js函数柯里化
  • 【计算机毕业设计案例】基于nodejs的宠物医院病宠信息管理系统的设计与实现(程序+文档+讲解+定制)
  • 三角函数完备
  • Note -「Spiking Neural Network」SNN 光速入门
  • 真心不骗你!AI论文网站,千笔·专业论文写作工具 VS 笔捷Ai,本科生专属神器!
  • 【毕业设计】基于php+vue的家教预约服务网页设计与开发(源码+文档+远程调试,全bao定制等)
  • 基于plc的扫描拾取机械手(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 2026年构建企业智慧大脑:五大核心知识库部署厂商推荐榜 - 品牌2025
  • 创客匠人视角:知识产品如何借力AI智能体,从“一次性交付”走向“持续生长”?