由基类到派生类的过程中,在派生类里如何访问基类成员,以及派生类对象如何访问基类成员,是根据派生类在从基类派生时是以什么方式进行的派生:public、protect或者private。下面说一下在这三种派生方式下成员函数和成员变量的访问和修改权限。派生类是指直接派生类!

【代码1】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Base{
    //其他内容
public:
    int BaseFunPb(){return m_nPb;}
    int BaseFunPt(){return m_nPt;}
    int BaseFunPr(){return m_nPr;}
public:     int m_nPb;
protectedint m_nPt;
private:    int m_nPr;
};
class Cpb:public Base{
    //其他内容
public:
    int GetPb(){return m_nPb;}
    int GetPt(){return m_nPt;}
    int GetPr(){return m_nPr;}
};
class Cpt:protected Base{
    //其他内容
public:
    int GetPb(){return m_nPb;}
    int GetPt(){return m_nPt;}
    int GetPr(){return m_nPr;}
};
class Cpr:private Base{
    //其他内容
public:
    int GetPb(){return m_nPb;}
    int GetPt(){return m_nPt;}
    int GetPr(){return m_nPr;}
};
   
int main()
{
    Cpb objB;
    Cpt objT;
    Cpr objR;
    //其他内容
}

访问分为:类对象访问、类内访问两种;

对于基类继承下来的成员的访问与修改权限如下:

基类成员访问权限(列)
public   protected   private  
派生方式(行) 派生类对象 派生类类内 派生类对象
派生类类内
派生类对象
派生类类内
public 可访/可修 权限:public
可访/可修
不可访/不可修 权限:protected
可访/不可修
可访/不可修 权限:private
可访/不可修
protected 可访/不可修 权限:protected
可访/不可修
可访/不可修 权限:private
可访/不可修
可访/不可修 权限:private
不可访/不可修
private 可访/不可修 权限:private
可访/不可修
可访/不可修 权限:private
可访/不可修
可访/不可修 权限:private
可访/不可修

派生类内不管是 public、protected、private 继承,总是可以访问基类中的public、protected 成员,基类中的 private 成员永远不能在派生类内直接访问,不论通过哪种方式。

派生类对象仅当public派生时,对基类中的public成员有可访问/可修改的权限,其他都为不可访问/不可修改。

用‘B’代表public,用'T‘代表protected,用'R’代表private;BT->T代表基类成员访问权限为B,派生方式为T,派生后成员在派生类内的访问权限为T;‘r'表示可访问,’w'代表可修改,‘-'表示不可访问或不可修改,在第一位表示不可访,在第二位表示不可修;则上表简化为如下:

访问权限变更
派生类对象 派生类类内 访问权限变更 派生类对象 派生类类内 访问权限变更
派生类对象 派生类类内
BB->B rw rw TB->T -- r- RB->R -- --
BT->T -- r- TT->R -- r- RT->R -- --
BR->R -- r- TR->R -- r- RR->R -- --

当派生类下面还有派生类时,派生类作为基类,权限更改同上!

C++学习之继承中的成员访问控制的更多相关文章

  1. C++中的类所占内存空间+继承中的成员访问控制

    C++学习之继承中的成员访问控制 C++中的类所占内存空间总结

  2. C++学习之继承中的访问控制

    我们通常认为一个类有两种不同的用户:普通用户 和 类的实现者.其中,普通用户编写的代码使用类的对象,这部分代码只能访问类的公有(接口)成员:实现者则负责编写类的成员和友元的代码,成员和友元既能访问类的 ...

  3. java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  4. Java学习之继承中的执行顺序详解

    代码块(理解) (1)用{}括起来的代码. (2)分类: A:局部代码块 用于限定变量的生命周期,及早释放,提高内存利用率. B:构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前 ...

  5. C++学习笔记-继承中的构造与析构

    C++存在构造函数与析构函数,继承中也存在构造和析构函数.继承中的构造和析构函数与普通的构造析构有细微差别. 赋值兼容性原则 #include "iostream" using n ...

  6. C#继承中构造函数,成员变量的执行顺序

    public class Animal { static string baseClassName; protected string _skincolor; Instancevariable iv ...

  7. Java基础学习-extends继承(成员变量,局部变量,成员方法)

    package extend; /*面向对象-继承: * 多个类的共同成员变量和成员方法.抽取到另一个类中(父类),我们多个类就可以访问到父类的成员了 * */ class Game{ String ...

  8. 【Java学习笔记之二十】final关键字在Java继承中的用法小结

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...

  9. (C/C++学习)5.C++中的虚继承-虚函数-多态解析

    说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同 ...

随机推荐

  1. UESTC 1437

    LCA模板题 随便找的倍增模板... #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+11; int t ...

  2. java Sprint boot 学习之一

    <properties> <project.build.sourceEncoding>UTF-</project.build.sourceEncoding> < ...

  3. C:foreEach

    c:forEach用法   <c:foreach>用法   <c:foreach>类似于for和foreach循环   以下是我目前见过的用法:1.循环遍历,输出所有的元素.& ...

  4. 3.Servlet(二)

    1.Servlet应用开发接口 对Servlet应用开发接口及功能的掌握,决定了是否能做好Servlet开发工作. GenericServlet抽象类 HttpServlet抽象类 2.Servlet ...

  5. python练习六十一:文件处理,读取文件内容

    python练习六十一:文件处理,读取文件内容 假设要读取text.txt文件中内容 写文件(如果有文件,那直接调用就行,我这里自己先创建的文件) list1 = ['python','jave',' ...

  6. Java学习笔记day06_自定义类_ArrayList

    1.自定义类class 使用类的形式, 对现实中的事物进行描述. 类是引用数据类型. 事物: 方法,变量. 方法:事物具备的功能. 变量:事物的属性. 格式: public class 类名{ //属 ...

  7. vue 子组件调用父组件的函数

    子组件调用父组件的函数,使用$emit(eventName,[...args]),触发当前实例上的事件.附加参数都会传给监听器回调. 子组件 <template> <div> ...

  8. mpdf Could not find image file (http://local.com/xxxxx)

    记录一下昨天和今天遇到的,yii2使用mpdf的时候,图片是使用php方法生成的二维码,所以图片地址为http://local.com/xxxxx,url中携带不同的参数. 但是开启了 $mpdf-& ...

  9. Linux安装mysql记录 重置密码

    重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor ...

  10. 数据结构---Java---HashSet

    1.概述 1.1 HashSet不是线程安全的: 1.2 当向HashSet存入元素时,调用该对象的hashCode()值,根据hashCode()值来决定元素的存储位置: 如果hashCode()值 ...