注意:本文有时候会用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关键字作用详解及派生类的访问权限的更多相关文章

  1. PHP中public,private,protected,abstract等关键字用法详解

    PHP中常用的关键字 在PHP中包含了很多对函数和类进行限制的关键字,常用的通常有abstract,final,interface,public,protected,private,static等等, ...

  2. public,protected,friendly,private的访问权限

    请说出作用域public,private,protected,以及不写时的区别 这四个作用域的可见范围如下表所示. 说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly. 作用域   ...

  3. Java访问权限修饰符public protected friendly private用法总结(转载好文Mark)

    首先声明:Java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly.为了条理清晰,分三种不同情况来总结. 一 访问权限修饰符修饰成员变量和 ...

  4. Java学习笔记(4)----Public,Protected,Package,Private修饰符可见性

    Java修饰符类型(public,protected,private,friendly) public的类.类属变量及方法,包内及包外的任何类均可以访问:protected的类.类属变量及方法,包内的 ...

  5. java 修饰符的作用一(public protected default private 组)

    1.public protected default private 组 public 权限最大,同类,同包,不同包,同包子类父类之间,不同包子类父类之间都可以访问. java 默认的权限是defau ...

  6. java四种权限修饰符(public > protected > (default) > private)

    权限修饰符在哪里可以访问 (default) : 表示什么权限修饰符都不写 位置 public protected (default) private 同一个类 yes yes yes yes 同一个 ...

  7. java中的 public protected friendly private

    1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...

  8. 【java基础】(1)Java的权限修饰符(public,protected,default,private)

    访问权限修饰符权限从高到低排列是public  ,protected  ,default, private. 一.根据“是否是同包”.“是否是子类”分为4中情况+本类 5种情况 二.把 同包中的子类 ...

  9. 窥探Swift之类的继承与类的访问权限

    上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swift中的类开了个头.关于类的内容还有很多,今天就来搞一下类中的继承以及类的访问权限.说到类的继承,接触过 ...

随机推荐

  1. UI 自动化环境搭建

    1,pip install selenium 2,驱动放在放在 Python 的根目录下

  2. python中的bytes和str类型

    经过一上午的查找资料.大概理清楚了bytes类型和str类型的区别. bytes类型和str类型在呈现形式有相同之处,如果你print一个bytes类型的变量,会打印一个用b开头,用单引号括起来的序列 ...

  3. MVC、MVP、MVVM模型

    在学习vue.react的过程中,总能看到MVVM模型,那么MVVM究竟是什么,下面将我最近看到的资料以及自己的想法总结一下. 与MVVM相似的,还有MVC.MVP,先从MVC.MVP这两个入手,方面 ...

  4. Windows程序设计(2) - API-02 文件系统

    一.磁盘分区的基本概念 1.磁盘分区(Patitions): 分区就是物理存储设备分割成多个不同的逻辑上的存储设备.分区从实质上说就是对硬盘的一种格式化.当我们创建分区时,就已经设置好了硬盘的各项物理 ...

  5. Windows 程序设计(4) MFC-02 基本控件-下

    1. TabCtrl 标签控件 1.1 创建主窗口 1)CMFCTabControlDlg,拖拽标签控件 2)增加变量 CTabCtrl m_tabCtrl 3)设置相关成员变量和处理函数 CFile ...

  6. mongodb 数据库 增删改查

    mongodb    数据库      增删改查 增: // 引入express 模块 var express = require('express'); // 路由var router = expr ...

  7. yum 安装Mysql8.0

    系统: CentOS 7(在CentOS 7中默认有安装MariaDB,这个是mysql的分支,一般来说还是使用自己安装的MySQL比较好) 1.下载并安装MySQL wget -i -c https ...

  8. mysql经典面试必须知道的

    http://www.cnblogs.com/wangshouchang/p/6930443.html 在华三的时候就问道了数据集的事务的四种特性,事务的隔离级别,事务的存储过程等

  9. 微信小程序 自定义省市选择器

    1.把省市数据放在city.js中,city.js放在until目录下 // city.js module.exports = { "province": [ { "ti ...

  10. 入门大数据---Map/Reduce,Yarn是什么?

    简单概括:Map/Reduce是分布式离线处理的一个框架. Yarn是Map/Reduce中的一个资源管理器. 一.图形说明下Map/Reduce结构: 官方示意图: 另外还可以参考这个: 流程介绍: ...