复习到C++派生问题时发现派生类访问权限是个问题。百度并实验了一下得出以下结论:
1.派生类public/protected/private继承,类内也无法访问父类private成员。
父类成员类型 \ 继承方法 | public | protected | private |
---|---|---|---|
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页