C++ 类中 “为继承而生“ 的访问级别:protect

 

C++ protected(受保护的)详解

C++关键字protected的作用详解_c++ protected_马小超i的博客-CSDN博客

======================

"为继承而生"

//对应于 3种不同的应用场景 ****************

public: 完全公开,任何模块都可以使用。

private: 完全私有,只有自己才能使用。

protect: 只想公开给同伙使用,禁止同伙之外的人(模块 /函数等等)使用。这就是“继承”?

         

友元函数:类似 protect,但更简单。友元只公开需要使用类中的有用部分(被使用者<源类> 自主控制公开的内容)。而继承则会继承到一堆有用的,以及没用的垃圾,如果编译器的优化能录不足,则会造成程序变得比 友元还要臃肿 ?(使用者<外部类> 自己决定需要使用的 源类的内容)。

同时,它们封装的程度也是不同的。

在从少成员继承,到最少成员继承的某个变化范围内,可能与友元的臃肿程度类似。

    到目前为止,我们知道,C++类中成员的访问级别有public与private,public公有级别能被外界直接访问,private只能被在类内部和类成员函数访问,不能被外界直接访问。但是我们又知道,子类继承父类后,便拥有了父类的所有属性,那么这个时候,子类能直接访问父类的私有成员吗?

    - 从面向对象的理论:子类拥有父类的所有属性,能直接访问父类的私有成员
    - 从C++语法分析:private属性的成员不能直接被外界访问

二者看似矛盾,下边我们就以代码来验证:

    #include <iostream>
    #include <string>
     
    using namespace std;
     
    class Parent
    {
    private:
        int m_value1;
        void fun1()
        {
            cout << "Parent::fun1()" << endl;
        }
     
    public:
        int m_value2;
        void fun2()
        {
            cout << "Parent::fun2()" << endl;
        }
    };
     
    class Child : public Parent    
    {
    public:
        void ChildFun()
        {
            m_value1 = 10;    //子类中直接访问父类的私有成员变量
            fun1();            //子类中直接访问父类的私有成员函数
     
            m_value2 = 20;    //子类中直接访问父类的公有成员变量
            fun2();            //子类中直接访问父类的公有成员变量
        }
     
    };
     
    int main()
    {
        Child C;
        C.ChildFun();
        
        system("pause");
    }

编译一下:

 从编译结果看,子类是无法直接访问父类的私有成员的

    在C++类中,成员除了有public与private属性外,还有protect(保护)属性,用protect修饰的成员,跟私有成员一样,无法被外界直接访问,但是能被子类直接访问。也可以说,protect就是专门为继承而生的。下边我们把上述代码中的private属性改为protect属性

    #include <iostream>
    #include <string>
     
    using namespace std;
     
    class Parent
    {
    protected:    //将原来的private属性改为protect属性
        int m_value1;
        void fun1()
        {
            cout << "Parent::fun1()" << endl;
        }
     
    public:
        int m_value2;
        void fun2()
        {
            cout << "Parent::fun2()" << endl;
        }
    };
     
    class Child : public Parent    
    {
    public:
        void ChildFun()
        {
            m_value1 = 10;    //子类中直接访问父类的保护成员变量
            fun1();            //子类中直接访问父类的保护成员函数
     
            m_value2 = 20;    //子类中直接访问父类的公有成员变量
            fun2();            //子类中直接访问父类的公有成员变量
        }
     
    };
     
    int main()
    {
        Child C;
        C.ChildFun();
        
        system("pause");
    }

编译输出:

 从输出结果可以看到,在子类中,是直接能访问父类的protect属性成员变量与成员函数的。

总结:

    -C++面向对象中的访问级别除了public、private外,还有protect
    -protect修饰的成员不能被外界所访问
    -protect修饰的成员能被子类直接访问
    -protect关键字是为了继承而专门设计的
    -没有protect就无法完成真正意义上的代码复用
————————————————
版权声明:本文为CSDN博主「火焰山大白菜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lms1008611/article/details/81543555

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值