您的位置:首页 > 编程语言 > C语言/C++

(zz)C++类的继承与多重继承的访问控制

2009-11-19 21:03 295 查看
前言: 面试时好几次被问到这个问题,刚问到的时候还真记不清了。

所以在网上搜索了比较详细的一个例子专门描述访问控制的。这里

的例子只针对成员变量,对成员函数也是一样的效果。

//程序作者:管宁
//站点: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类成员的控制类型
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: