经过using声明改变个别成员的可访问性

 

C++的语法中经过在派生类中使用using声明能够忽略继承方式 , 而让派生类对于基类的私有和保护成员具备特殊的访问权限 , 甚至能够改变派生类对象对于基类成员的访问权限 .ios

我的认为这种语法很容易让别人对于本身的代码产生误解 , 应该尽可能少用或不用 . 为防止本身忘记 , 下面记录一下我的的理解 .函数

 

引用之C++ Primer5 P546spa

 

经过在类的内部使用using声明语句 , 咱们能够将该类的直接或间接基类中的任何可访问成员标记出来 (非私有成员) . using声明语句中名字的访问权限由该using声明语句以前的访问说明符来决定code

白话文解释 : 在派生类的内部经过using声明语句 , 咱们能够忽略继承方式 ,改变派生类中可访问的基类成员在派生类中的访问权限orm

 

经过using声明改变类的继承方式

文字可能很差理解 , 看代码实例更容易体会
对象

 1 class Base
 2 {
 3 public:
 4     int base_public;
 5 protected:
 6     int base_protect;
 7 private:
 8     int base_private;
 9 };
10 
11 class Derive :private Base
12 {
13 public:
14     using Base::base_public;
15 protected:
16     using Base::base_protect;
17 private:
18     //using Base::base_private; // error , 编译器报错 , 不可访问
19 };

代码示例中 , 派生类Derive经过private的方式继承了基类Base , 然而又经过using声明改变了基类成员的访问权限 ,blog

也就是说这段代码中 , 虽然表面上派生类是以private的方式继承了基类  ,而实际上派生类对于基类的访问权限就是public的方式 ! 继承

代码实例中能够看出在派生类中没法经过using声明来标记基类的私有成员 , 也验证了书中的话  .ci

因为继承的特性 , 基类的私有成员仍然会自动成为派生类的私有成员作用域

然而这样的代码 , 很容易让人产生误解 .

 

经过using声明 , 作出一些不合常规的代码

 using声明语句中名字的访问权限由该using声明语句以前的访问说明符来决定

经过这一特性 , 甚至能够改变基类成员在派生类中的访问权限 ! 一样经过一些代码来演示

 1 #pragma warning (disable:4996)
 2 #include <iostream>
 3 
 4 class Base
 5 {
 6 public:
 7     int base_public = 1;
 8 protected:
 9     int base_protect = 2;
10 private:
11     int base_private = 3;
12 };
13 
14 class Derive :private Base
15 {
16 public:
17     //在public做用域声明基类中的成员
18     using Base::base_public;
19     using Base::base_protect;
20     //using Base::base_private; // error , 编译器报错 , 不可访问
21 };
22 
23 int main()
24 {
25     Derive test;
26     std::cout << "基类的公有成员: "<< test.base_public << std::endl;
27     std::cout << "基类的保护成员: " << test.base_protect << std::endl;
28     //std::cout << "基类的私有成员: " << test.base_private << std::endl; //error , 不可访问
29 
30     system("pause");
31     return EXIT_SUCCESS;
32 }

代码中经过给基类的成员设定了默认初始值以便访问时显示 , 最终的运行结果以下

基类的公有成员: 1
基类的保护成员: 2
请按任意键继续. . .

代码中派生类继承时一样使用private的方式继承 , 然而咱们把using声明放在了public权限下  , 因为 " using声明语句中名字的访问权限由该using声明语句以前的访问说明符来决定

因此此时基类中的公有成员和保护成员都变成了派生类中的公有成员  , 也就是说经过using声明 , 咱们经过私有继承的派生类 比 公有继承的访问权限反而更高  ! 

 

在main()函数中 派生类的对象能够访问基类的保护成员也验证了基类的保护成员在派生类中的访问权限已变成公有 .

也就是说经过这样的方式派生类对象能够访问基类的保护成员 , 而基类本身的对象却没法访问 .

须要注意的是经过派生类访问基类的保护成员时 , 编译器并不会给出智能提示 . 

 

 

 

经过在类的内部使用using声明语句 , 咱们能够将该类的直接或间接基类中的任何可访问成员标记出来 (只限于非私有成员) . using声明语句中名字的访问权限由该using声明语句以前的访问说明符来决定

相关文章
相关标签/搜索