C++ 派生类访问权限

复习到C++派生问题时发现派生类访问权限是个问题。百度并实验了一下得出以下结论:

1.派生类public/protected/private继承,类内也无法访问父类private成员。

父类成员类型 \ 继承方法publicprotectedprivate
public
protected
private×××

2.private继承,在父类public成员变量自动降级为private,

#include<iostream>
using namespace std;
class Parent {
public:
    Parent():a(0),b(0),c(0){}
    virtual ~Parent() = default;
    int a;
protected:
    int b;
private:
    int c;
};
//public继承
class Child1 :public Parent{
public:
    void test()
    {
        a = 0;//√基类共有的属性派生类可以随意访问
        b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问
    //    c = 0;//× 基类私有属性可以继承但不能访问
    }
protected:

private:
};
//private继承
class Child2 :private Parent {
public:
    void test()
    {
        a = 0;//√基类共有的属性派生类类内可以随意访问,就算是private继承也可以,但是派生类外不能访问
        b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问,就算是private继承也可以,但是派生类外不能访问
       // c = 0;//× 基类私有属性可以继承但不能访问
    }

    void geta()
    {return a;
    }
    void getc()
    {
        return c;
    }
protected:

private:
};
//protected继承
class Child3 :protected Parent {
public:
    void test()
    {
        a = 0;//√基类共有的属性派生类类内可以随意访问,派生类外不能访问
        b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问,派生类外不能访问
       //c = 0;//× 基类私有属性可以继承但不能访问
    }
protected:

private:
};
int main()
{
    Child1 c1;
    c1.a = 10;//√
    //c1.b = 20;//× 受保护的属性不能在类外访问
    //c1.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类

    Child2 c2;
    //c2.a = 10;//× private继承基类的共有属性也不可以在类外访问
    cout<<c2.geta()<<endl; // 可通过定义public函数访问private属性;
    //c2.b = 20;//× 受保护的属性不能在类外访问
    //c2.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类

    Child3 c3;
    //c3.a = 10;//× protected继承基类的共有属性也不可以在类外访问
    //c3.b = 20;//× 受保护的属性不能在类外访问
    //c3.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
    cout<<c2.geta()<<endl;
    system("pause");
    return 0;
}

主要内容转载自https://www.cnblogs.com/yangguang-it/p/6495494.html
3.public派生类,不论是派生类对象访问自己的成员,还是通过 function(child& item)传入新成员,都不可访问从基类继承的原有的private对象,可访问继承来的protected、新的protected private成员;
而 function(base& item) , protected private成员都是无法访问的。

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
class base{
    protected:
    int pro = 1;
    private:
    int pri =2;
};

class child : public base{
    protected:
    int childpro =11;
    private:
    int childpri = 21;
    public :
    void showchild(child& item)
    {cout<<item.pro<<endl
    <<item.childpri<<endl
    <<item.childpro<<endl;}
	
	//不可访问派生类从基类继承的private成员
	//void showchild2(child& item)
	//{cout<<item.pri<<endl;}
	
    //不可访问基类成员的protected变量
   // void showbase(base& item){cout<<item.pro<<endl;}
};


int main()
{
    base b;
    child c;
    child c1;
    c.showchild(c1);
    //下面两个会报错
    //c.showchild2(c1)
    //c.showbase(b);
    system("pause");
    return 0;
};

结果:在这里插入图片描述
访问成功;

参考https://www.cnblogs.com/xiaoman_890/archive/2009/05/14/1456581.html、
参考c++primer第五版543页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值