(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类成员的控制类型
}
};
所以在网上搜索了比较详细的一个例子专门描述访问控制的。这里
的例子只针对成员变量,对成员函数也是一样的效果。
//程序作者:管宁
//站点: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类成员的控制类型
}
};
相关文章推荐
- C++类的继承与多重继承的访问控制
- C++类的继承与多重继承的访问控制(转载)
- C++类的继承与多重继承的访问控制
- C++类的继承与多重继承的访问控制(转载)
- C++类的继承与多重继承的访问控制
- C++类的继承与多重继承的访问控制
- C++类的继承与多重继承的访问控制
- C++类的继承与多重继承的访问控制(收藏)
- C++类的继承与多重继承的访问控制(网易学院)
- C++类访问控制及继承
- c++类继承中的using声明,派生类中用using声明改变基类成员的访问权限[zz]
- C++类访问控制及继承
- C++类访问控制及继承
- C++类的继承和派生,访问控制
- 浅谈c++类成员的三种访问控制方式和类继承派生时的三种继承方式
- c++类的访问控制与继承
- C++类访问控制及继承
- C++类访问控制及继承
- C++类访问控制--public,protected,private的使用(未完)
- C++之 继承后的访问控制