c++ 中继承方式权限转变 以及 恢复访问权限

参考:

http://www.cnblogs.com/bizhu/archive/2012/07/20/2601303.html

http://blog.csdn.net/slience_perseverance/article/details/20294053



public 继承


public  => public

protected  => protected

private => 子类无权访问


protect继承


public  => protected

protected  => protected

private  => 子类无权访问


private继承


public  = > private

protected  = > private

private  = > 子类无权访问


由以上组合结果可以看出


1、public  继承不改变变量的访问权限

2、protect继承将变量权限改为protect

3、private继承将边淋权限改为private

4、基类中的private成员不受继承方式的影响,子类永远无权访问。


恢复访问权限 :


此外,在使用private继承时,还存在另外一种机制:准许访问 。

我们已经知道,在基类以private方式被继承时,其public和protected成员在子类中变为private成员。然而某些情况下,需要在子类中将一个或多个继承的成员恢复其在基类中的访问权限。

C++支持以两种方式实现该目的

方法一,使用using 语句,这是C++标准建议使用的方式

方法二,使用访问声明,形式为 base-class::member;, 位置在子类中适当的访问声明处。(注,只能恢复原有访问权限,而不能提高或降低访问权限)



#include<iostream>
#include<string>
using namespace std;

class A
{
	int data;
public:
	void set_data(int n){data = n;}
	void disp_data(){cout<<"data = "<<data<<endl;}
         <span style="white-space:pre">	</span>......
};

class B:private A
{
public:
	A::set_data;//访问声明  <span style="color:#3333ff;">>___<只需要声明函数的名称就可以了</span>
<span style="white-space:pre">	</span>//或者是 using A::set_data;
	A::disp_data;//访问声明
<span style="white-space:pre">	</span>//或者是 using A::disp_data;
<span style="white-space:pre">		</span><span style="font-family:Arial, Helvetica, sans-serif;">......</span><span style="white-space:pre">
</span>
};

int main()
{
	B b;
	b.seta(1);
	b.dispa();
	return 0;
}

以下转载自:http://blog.csdn.net/shuaishuai80/article/details/6129874

以下观点用visual studio 2008 c++ 试验可行,但难免有误,如发现错误请指出。在《c++primer第四版中文》p572页的注解中指出:“派生类可以恢复继承成员的访问级别,但不能使访问级别比基类中原来指定的更严格或更宽松”。亲自用visual studio 2008试验了一下,怀疑书上观点有误,特别写出和大家交流,以找出正确答案。

    在基类中的private成员,不能在派生类中任何地方用using声明。
    在基类中的protected成员,可以在派生类中任何地方用using声明。当在public下声明时,在类定义体外部,可以用派生类对象访问该成员,但不能用基类对象访问该成员;当在protected下声明时,该成员可以被继续派生下去;当在private下声明时,对于派生类定义体外部来说,该成员是派生类的私有成员。
    在基类中的public成员,可以在派生类中任何地方用using声明。具体声明后的效果同基类中的protected成员。

    例:
 class A 
 {
 public:
  int f1; 
 protected:
  int f2;
 private:
  int f3;
 };

 //如下声明只是举例,实际声明中不能重复声明同一成员。
 class B : public A  //这里的访问标号可以是任意,它只影响没有被显示声明的从基类继承的成员的访问
 {
 public:
  using A::f1; //从基类继承的public成员,此处声明后可以被外部访问
  using A::f2; //从基类继承的protected成员,此处声明后可以被外部访问
  using A::f3; //声明错误,派生类不可访问基类的private成员,即使声明也不行
 protected:
  using A::f1; //从基类继承的public成员,此处声明后可以被下级派生类访问,但不能被外部访问
  using A::f2; //从基类继承的protected成员,此处声明后可以被下级派生类访问,但不能被外部访问
  using A::f3; //声明错误,派生类不可访问基类的private成员,即使声明也不行
 private:
  using A::f1; //从基类继承的public成员,此处声明后既不能被下级派生类访问,也不能被外部访问
  using A::f2; //从基类继承的protected成员,此处声明后既不能被下级派生类访问,也不能被外部访问
  using A::f3; //声明错误,派生类不可访问基类的private成员,即使声明也不行
 };

 

总结:可被派生类访问的基类成员,都可以在派生类中的任何访问标号下用using声明,对于派生类外部来说,被声明成员的访问权限由using声明所在的访问标号决定,与基类中的访问权限无关,也与派生列表中的访问标号无关。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值