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)
原文链接: https://www.cnblogs.com/yangguang-it/p/6495494.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/250164

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午4:17
下一篇 2023年2月14日 上午4:18

相关推荐