前言: 面试时好几次被问到这个问题,刚问到的时候还真记不清了。
所以在网上搜索了比较详细的一个例子专门描述访问控制的。这里
的例子只针对成员变量,对成员函数也是一样的效果。
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必闻名出处和作
#include <iostream>
using namespace std;
class Base
{
public://公有的
int a1;
virtual void test() = 0;
protected://受保护的
int a2;
private://私有的
int a3;
};
//------------------------------------------------------------------------------
//保护继承
class ProtectedClass : protected Base{
public:
void test()
{
a1 = 1;//a1在这里被转变为protected
a2 = 2;//a2在这里被转变为protected
//a3=3;//错误,派生类不能访问基类的私有成员
}
};
//以public方式继承ProtectedClass类
class ControlProtectedClass: public ProtectedClass
{
public:
void test()
{
a1 = 1;//a1在这里仍然保持为a1在这里被转变为protected
a2 = 2;//a2在这里仍然保持为a1在这里被转变为protected
//a3=3;//错误,由于Base类成员为私有的,即使是上级父类是保护继续,也不能改变Base类成员的控制类型
}
};
//------------------------------------------------------------------------------
//私有继承
class PrivateClass:private Base{
public:
void test()
{
a1 = 1;//a1在这里被转变为private
a2 = 2;//a2在这里被转变为private
//a3=3;//错误,基类私有成员对文件区域与派生类区域都是不可访问的
}
};
//以public方式继承PrivateClass类
class ControlPrivateClass: public PrivateClass
{
public:
void test()
{
//a1=1;//错误,由于基类PrivateClass为私有继续,a1已经转变为private
//a2=2;//错误,由于基类PrivateClass为私有继续,a1已经转变为private
//a3=3;//错误,由于Base类成员为私有的,PrivateClass类也为私有继续
}
};
//------------------------------------------------------------------------------
//共有继续有区别与其它方式的继续,继续后的各成员不会其改变控制方式
class PublicClass:public Base
{
public:
void test()
{
a1 = 1;//a1仍然保持public
a2 = 2;//a2仍然保持protected
//a3=3;//错误,派生类不能操作基类的私有成员
}
};
//以public方式继承PublicClass类
class ControlPublicClass:public PublicClass{
public:
void test()
{
a1 = 1;//a1仍然保持public
a2 = 2;//a2仍然保持protected
//a3=3;//错误,由于Base类成员为私有成员,即使是上级父类是公有继续,也不能改变Base类成员的控制类型
}
};