参考:
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声明所在的访问标号决定,与基类中的访问权限无关,也与派生列表中的访问标号无关。