C++中类继承public,protected和private关键字作用详解及派生类的访问权限
注意:本文有时候会用Visual Studio Code里插件的自动补全功能来展示访问权限的范围(当且仅当自动补全范围等价于对象访问权限范围的时候),但是不代表只要是出现在自动补全范围内的可调用对象/成员都是合法的。
一,公有继承
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<vector> class Base{
public:
int PublicBase;
void PublicPrint() {std::cout << "PublicPrint()" << std::endl;}
protected:
int ProtectedBase;
void ProtectedPrint() {std::cout << "ProtectedPrint()" << std::endl;}
private:
int PrivateBase;
void PrivatePrint() {std::cout << "PrivatePrint()" << std::endl;}
}; class Derived : public Base{
public:
void DerivedPrint() {
std::cout << "DerivedPrint()" << std::endl;
std::cout << ProtectedBase << std::endl;
//若要访问protected的数据成员需要通过派生类里的成员函数访问
PublicPrint();
ProtectedPrint();
}
}; int main(void)
{
Derived der;
der.PublicPrint();
der.PublicBase;
//der.ProtectedBase; //不能直接访问protected数据成员
//der.ProtectedPrint();//意思同上
return ;
}
公有继承的派生类可以直接访问基类的public中的数据成员和成员函数,不能直接访问protected中的数据成员和成员函数,若要访问protected的数据成员需要通过派生类里的成员函数访问。基类里的private成员函数及数据成员派生类是没有访问权限的。但是我们可以通过间接调用Base::function()来访问Base类里的private对象。
派生类成员函数的访问权限一览:

用户的访问权限一览(非常显然了):

其实再添几行代码,很容易知道Derived的派生类访问权限(SeconedDerived类是Derived的公有继承):

二,保护继承
部分代码改变如下:
class Derived : protected Base{
public:
void DerivedPrint() {
std::cout << "DerivedPrint()" << std::endl;
std::cout << ProtectedBase << std::endl;
//若要访问protected的数据成员需要通过派生类里的成员函数访问
PublicPrint();
ProtectedPrint();
}
};
通常保护继承的派生类访问基类成员的权限和公有继承的派生类访问基类成员的权限相同,保护继承的派生类对象访问父类成员的权限和私有继承子类对象访问父类成员的权限相同。(der是Derived实例)


可以看出派生类的访问权限并没有什么改变。但是派生类会将所有从基类继承的成员全部放到protected下。不多赘述。
三,私有继承
部分代码改变如下:
class Derived : private Base{
public:
void DerivedPrint() {
std::cout << "DerivedPrint()" << std::endl;
}
};
私有继承的过程中,基类中的public和protected属性的成员在派生类中虽然能被访问,但是其属性在派生类中被降级为private,可以当作Derived类的private来访问。
C++中类继承public,protected和private关键字作用详解及派生类的访问权限的更多相关文章
- PHP中public,private,protected,abstract等关键字用法详解
PHP中常用的关键字 在PHP中包含了很多对函数和类进行限制的关键字,常用的通常有abstract,final,interface,public,protected,private,static等等, ...
- public,protected,friendly,private的访问权限
请说出作用域public,private,protected,以及不写时的区别 这四个作用域的可见范围如下表所示. 说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly. 作用域 ...
- Java访问权限修饰符public protected friendly private用法总结(转载好文Mark)
首先声明:Java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly.为了条理清晰,分三种不同情况来总结. 一 访问权限修饰符修饰成员变量和 ...
- Java学习笔记(4)----Public,Protected,Package,Private修饰符可见性
Java修饰符类型(public,protected,private,friendly) public的类.类属变量及方法,包内及包外的任何类均可以访问:protected的类.类属变量及方法,包内的 ...
- java 修饰符的作用一(public protected default private 组)
1.public protected default private 组 public 权限最大,同类,同包,不同包,同包子类父类之间,不同包子类父类之间都可以访问. java 默认的权限是defau ...
- java四种权限修饰符(public > protected > (default) > private)
权限修饰符在哪里可以访问 (default) : 表示什么权限修饰符都不写 位置 public protected (default) private 同一个类 yes yes yes yes 同一个 ...
- java中的 public protected friendly private
1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...
- 【java基础】(1)Java的权限修饰符(public,protected,default,private)
访问权限修饰符权限从高到低排列是public ,protected ,default, private. 一.根据“是否是同包”.“是否是子类”分为4中情况+本类 5种情况 二.把 同包中的子类 ...
- 窥探Swift之类的继承与类的访问权限
上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...
随机推荐
- Tensorflow从0到1(4)之神经网络
一维数据集上的神经网络 # 1 引入包,创建会话 import tensorflow as tf import numpy as np sess = tf.Session() # 2 初始化数据 da ...
- python基础内容整理(一)
基本数据类型 字符串 String 字符串是不可变类型 字符串的分割: s.split(sep)以给定的sep为分隔符对s进行分割. In [4]: s = "hello world&quo ...
- APP自动化1——Appium+pycharm自动化环境搭建全流程
1. 安装python3,pycharm,可参考之前写的文档:https://www.cnblogs.com/chenweitoag/p/13154815.html 2. 准备以下必要工具: 基于wi ...
- Java 多线程基础(七)线程休眠 sleep
Java 多线程基础(七)线程休眠 sleep 一.线程休眠 sleep sleep() 方法定义在Thread.java中,是 static 修饰的静态方法.sleep() 的作用是让当前线程休眠, ...
- 昇腾AI计算,618冲动消费也不怕
摘要:近期大热的图像识别处理核赔技术,可应对剁手党们冲动购物之后汹涌而至的退货场景.那么,这背后运用的技术原理是怎样? AI计算平台又能否重构企业业务引擎呢? 随着AI技术的挖掘与应用落地,也为每一年 ...
- GeckoDriver+Selenium+Python的安装和使用
如果没有安装GeckoDriver会提示: selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executab ...
- 从零开始学习Prometheus监控报警系统
Prometheus简介 Prometheus是一个开源的监控报警系统,它最初由SoundCloud开发. 2016年,Prometheus被纳入了由谷歌发起的Linux基金会旗下的云原生基金会( C ...
- 一分钟开始持续集成之旅系列之:C 语言 + Makefile
作者:CODING - 朱增辉 前言 make 工具非常强大,配合 makefile 文件可以实现软件的自动化构建,但是执行 make 命令依然需要经历手动输入执行.等待编译完成.将目标文件转移到合适 ...
- git提交时报错:Updates were rejected because the tip of your current branch is behind
有如下3种解决方法: 1.使用强制push的方法:git push -u origin master -f这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候. 2.push前先将远程rep ...
- Eureka心跳健康检查机制和Spring boot admin 节点状态一直为DOWN的排查(忽略某一个节点的健康检查)
https://www.jdon.com/springcloud/eureka-health-monitoring.html 运行阶段执行健康检查的目的是为了从Eureka服务器注册表中识别并删除不可 ...