zoukankan      html  css  js  c++  java
  • c++派生类的访问控制权限

    派生类必须通过使用类派生列表, 明确指出它是从哪个(哪些)基类继承而来的。类派生列表的形式是:首先是一个冒号,后面紧跟以逗号分隔的基类列表(可以多继承,但一般不使用多继承),其中每个基类前面可以有以下三种访问说明符中的一个:public,private,protectedd。

    c++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望其派生类进行覆盖的函数,另一种是基类希望派生类直接继承而不要改变的函数。对于前者,基类通常将其定义为虚函数(virtual)。当我们使用指针或者引用调用虚函数时,该调用将被动态绑定。根据引用或者指针所绑定的对象类型不同,该调用可能执行基类的版本也可能执行某个派生类的版本。在某些时候基类希望它的派生类有权访问该成员,同时禁止其他用户访问。我们用受保护的(protected)访问运算符来说明这样的成员。

    基类通过在其成员函数声明语句之前加上关键字virtual使得改函数执行动态绑定。任何构造函数之外的非静态函数都可以是虚函数。关键字virtual只能出现在类内部声明语句之前而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。

    之后会详细介绍虚析构造函数,现在只用记住作为继承关系中根节点的类(基类)通常都会定义一个虚析构造函数即本例中的 virtual ~Parent()=default。基类通常应该定义一个虚析构造函数,即使该函数不执行任何实际操作也是如此(原因等后面随笔的解释——不这样可能会导致内存泄漏,释放子类的资源同时也要释放父类的资源才行)。

    代码操练:

     1 #include<iostream>
     2 using namespace std;
     3 class Parent {
     4 public:
     5     Parent():a(0),b(0),c(0){}
     6     virtual ~Parent() = default;
     7     int a;
     8 protected:
     9     int b;
    10 private:
    11     int c;
    12 };
    13 //public继承
    14 class Child1 :public Parent{
    15 public:
    16     void test()
    17     {
    18         a = 0;//√基类共有的属性派生类可以随意访问
    19         b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问
    20     //    c = 0;//× 基类私有属性可以继承但不能访问
    21     }
    22 protected:
    23 
    24 private:
    25 };
    26 //private继承
    27 class Child2 :private Parent {
    28 public:
    29     void test()
    30     {
    31         a = 0;//√基类共有的属性派生类类内可以随意访问,就算是private继承也可以,但是派生类外不能访问
    32         b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问,就算是private继承也可以,但是派生类外不能访问
    33         //c = 0;//× 基类私有属性可以继承但不能访问
    34     }
    35 protected:
    36 
    37 private:
    38 };
    39 //protected继承
    40 class Child3 :protected Parent {
    41 public:
    42     void test()
    43     {
    44         a = 0;//√基类共有的属性派生类类内可以随意访问,派生类外不能访问
    45         b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问,派生类外不能访问
    46        //c = 0;//× 基类私有属性可以继承但不能访问
    47     }
    48 protected:
    49 
    50 private:
    51 };
    52 int main()
    53 {
    54     Child1 c1;
    55     c1.a = 10;//56     //c1.b = 20;//× 受保护的属性不能在类外访问
    57     //c1.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
    58 
    59     Child2 c2;
    60     //c2.a = 10;//× private继承基类的共有属性也不可以在类外访问
    61     //c2.b = 20;//× 受保护的属性不能在类外访问
    62     //c2.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
    63 
    64     Child3 c3;
    65     //c3.a = 10;//× protected继承基类的共有属性也不可以在类外访问
    66     //c3.b = 20;//× 受保护的属性不能在类外访问
    67     //c3.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
    68     cout << "hello world!
    ";
    69     return 0;
    70 }

    summary:

    一个类的pubulic属性在类内、类外都可以访问,

    private属性只能在这个类内访问,

    protected属性可以在这个类内访问也可以在这个类的派生类类内中访问,不能在基类和派生类外部访问。

    总结表如下:

                     基类权限:      public         private     protected

     继承权限:public 继承       public         private     protected

                      private继承       private        private     private

                    protected继承    protected    private     protected     

    继承访问权限三看原则:

    ①:看使用的方法在类的内部还是外部

    ②:看子类的继承权限(public  private  protected)

    ③:看基类的权限(public  private  protected)

  • 相关阅读:
    大道至简第5 章 失败的过程也是过程读后感
    序列化组件之MoelSerializer
    序列化组件之Serializer
    DRF框架 生命周期 及五大模块源码分析
    Restful API 接口与规范
    Vue原理及核心
    Vue之路由跳转传参,插件安装与配置
    Vue项目搭建及环境配置
    Vue之组件
    Vue实例成员及事件
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6495494.html
Copyright © 2011-2022 走看看