• C++ public private protect 继承关系(链接)


    基础链接

    总结:  public继承基类成员访问权限没有变化;

             protected继承基类public和protected权限变为protected,基类private不变。

             private继承基类public和protected权限变为private,基类private不变,所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。

             (根据派生类继承的方式,可推导派生类向基类转换时用户代码和成员函数和友元函数的可访问性)

             1.public继承基类,派生类成员和友元都可以访问,(Base* B=new Diveration)用户代码,相对基类可以看到子类从基类继承的部分有public成员可访问;

             2.任何继承方式,派生类成员和友元都可以访问,用户代码根据继承区别;

             3.public&protected继承基类,派生类的派生类成员和友元都可以访问,而private继承不可访问(都变成派生类的私有了,不管你派生类的派生类怎么继承都是不可见的)

     1 class Base
     2 {
     3 public:
     4     virtual void Try() const =0;
     5 
     6     int public_int;
     7 protected:
     8     int protected_int;
     9 private:
    10     int private_int;
    11 };
    12 
    13 
    14 //继承改变的是public&protected
    15 //private属于基类
    16 class DiverA : public Base
    17 {
    18 public:
    19 
    20     //不管什么继承内部只有基类的public&protected可访问(任何继承public&protected的变化对于派生类都可见)
    21     void Try() const override
    22     {
    23         std::cout << public_int << std::endl;
    24         std::cout << protected_int << std::endl;
    25         //std::cout << private_int << std::endl;
    26     }
    27 
    28 };
    29 
    30 int main(int argc, char *argv[])
    31 {
    32 
    33     Base *B = new DiverA;
    34     B->Try();
    35     B->public_int;  //相对基类,派生类继承public区对基类可见而protected区和private区相对不可见;
    36                     //其他继承可以推导
    37 
    38     return 0;
    39 }

    可以通过using声明改变继承变量的权限(原private除外,虽然继承但是还是属于基类私有)

    注意:派生类只能为那些它能访问到的成员提供using

     1 //基类
     2 class Base
     3 {
     4 public:
     5     int public_int;
     6 protected:
     7     int protected_int;
     8 private:
     9     int private_int;
    10 };
    11 
    12 
    13 //派生类
    14 class DiverA : private Base
    15 {
    16 public:
    17     //通过using改变继承权限,用户代码也改变
    18     using Base::public_int;
    19     using Base::protected_int;
    20 };
    21 
    22 //派生类的派生类
    23 class DiverA_Diver : public DiverA
    24 {
    25 
    26 };
    27 
    28 int main(int argc, char *argv[])
    29 {
    30 
    31     //普通代码
    32     DiverA_Diver A;
    33     A.protected_int;
    34     A.public_int;
    35 
    36     //普通代码
    37     DiverA B;
    38     B.public_int;
    39     B.protected_int;
    40 
    41     //用户代码(派生类向基类转换,权限改变了)
    42     DiverA *base = new DiverA_Diver;
    43     base->protected_int;
    44     base->public_int;
    45 
    46     return 0;
    47 }
  • 相关阅读:
    formData实现图片上传
    input[type='file']样式美化及实现图片预览
    第一个Vue插件从封装到发布
    lastIndex对正则结果的影响
    使用图片地图减少HTTP请求数量
    实现文字颜色渐变
    vue-cli中如何引入jquery
    事件处理详解
    图片载入状态判断及实现百分比效果loading
    页面加载时触发的事件及顺序
  • 原文地址:https://www.cnblogs.com/xuaidongstdudyrecording/p/7198336.html
Copyright © 2020-2023  润新知