c++派生类的访问控制权限


派生类必须通过使用类派生列表, 明确指出它是从哪个(哪些)基类继承而来的。类派生列表的形式是:首先是一个冒号,后面紧跟以逗号分隔的基类列表(可以多继承,但一般不使用多继承),其中每个基类前面可以有以下三种访问说明符中的一个:public,private,protectedd。

c++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望其派生类进行覆盖的函数,另一种是基类希望派生类直接继承而不要改变的函数。对于前者,基类通常将其定义为虚函数(virtual)。当我们使用指针或者引用调用虚函数时,该调用将被动态绑定。根据引用或者指针所绑定的对象类型不同,该调用可能执行基类的版本也可能执行某个派生类的版本。在某些时候基类希望它的派生类有权访问该成员,同时禁止其他用户访问。我们用受保护的(protected)访问运算符来说明这样的成员。

基类通过在其成员函数声明语句之前加上关键字virtual使得改函数执行动态绑定。任何构造函数之外的非静态函数都可以是虚函数。关键字virtual只能出现在类内部声明语句之前而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。

之后会详细介绍虚析构造函数,现在只用记住作为继承关系中根节点的类(基类)通常都会定义一个虚析构造函数即本例中的 virtual ~Parent()=default。基类通常应该定义一个虚析构造函数,即使该函数不执行任何实际操作也是如此(原因等后面随笔的解释——不这样可能会导致内存泄漏,释放子类的资源同时也要释放父类的资源才行)。

代码操练:

 1 #include<iostream>
 2 using namespace std;  3 class Parent {  4 public:  5     Parent():a(0),b(0),c(0){}  6     virtual ~Parent() = default;  7     int a;  8 protected:  9     int b; 10 private: 11     int c; 12 }; 13 //public继承
14 class Child1 :public Parent{ 15 public: 16     void test() 17  { 18         a = 0;//√基类共有的属性派生类可以随意访问
19         b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问 20     // c = 0;//× 基类私有属性可以继承但不能访问
21  } 22 protected: 23 
24 private: 25 }; 26 //private继承
27 class Child2 :private Parent { 28 public: 29     void test() 30  { 31         a = 0;//√基类共有的属性派生类类内可以随意访问,就算是private继承也可以,但是派生类外不能访问
32         b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问,就算是private继承也可以,但是派生类外不能访问 33         //c = 0;//× 基类私有属性可以继承但不能访问
34  } 35 protected: 36 
37 private: 38 }; 39 //protected继承
40 class Child3 :protected Parent { 41 public: 42     void test() 43  { 44         a = 0;//√基类共有的属性派生类类内可以随意访问,派生类外不能访问
45         b = 0;//√基类受保护的属性可以在基类类内和子类类内中访问,派生类外不能访问 46        //c = 0;//× 基类私有属性可以继承但不能访问
47  } 48 protected: 49 
50 private: 51 }; 52 int main() 53 { 54  Child1 c1; 55     c1.a = 10;//56     //c1.b = 20;//× 受保护的属性不能在类外访问 57     //c1.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
58 
59  Child2 c2; 60     //c2.a = 10;//× private继承基类的共有属性也不可以在类外访问 61     //c2.b = 20;//× 受保护的属性不能在类外访问 62     //c2.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
63 
64  Child3 c3; 65     //c3.a = 10;//× protected继承基类的共有属性也不可以在类外访问 66     //c3.b = 20;//× 受保护的属性不能在类外访问 67     //c3.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
68     cout << "hello world!\n"; 69     return 0; 70 }

summary:

一个类的pubulic属性在类内、类外都可以访问,

private属性只能在这个类内访问,

protected属性可以在这个类内访问也可以在这个类的派生类类内中访问,不能在基类和派生类外部访问。

总结表如下:

                 基类权限:      public         private     protected

 继承权限:public 继承       public         private     protected

                  private继承       private        private     private

                protected继承    protected    private     protected     

继承访问权限三看原则:

①:看使用的方法在类的内部还是外部

②:看子类的继承权限(public  private  protected)

③:看基类的权限(public  private  protected)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM