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 }