c++类继承中的using声明,派生类中用using声明改变基类成员的访问权限[zz]
2012-05-29 21:24
281 查看
以下观点用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声明所在的访问标号决定,与基类中的访问权限无关,也与派生列表中的访问标号无关。
在基类中的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声明所在的访问标号决定,与基类中的访问权限无关,也与派生列表中的访问标号无关。
相关文章推荐
- [转]c++类继承中的using声明,派生类中用using声明改变基类成员的访问权限
- c++类继承中的using声明,派生类中用using声明改变基类成员的访问权限
- C++ 中基类及派生类中继承成员访问权限
- 三十八、继承与派生:派生类对基类成员的访问控制之保护继承与私有继承
- 第十二周任务二(理解基类成员的访问限定符和派生类的继承方式)
- 第13周-项目1-基类中成员的访问限定符和派生类的继承方式
- C++primer原书中的一个错误(派生类using声明对基类权限的影响)
- C++基类和派生类私有、保护、公有成员访问控制以及动态绑定、三种继承
- 继承与派生:派生类对基类成员的访问控制之公有继承
- 13_1理解基类中成员的访问限定符和派生类的继承方式
- [导入]派生类对基类成员的访问权限
- 5月8日实验报告(一)理解基类成员的访问限定符和派生类的继承方式
- 【项目1 - 长颈鹿类对动物类的继承】理解基类中成员的访问限定符和派生类的继承方式
- 派生类访问基类成员权限
- 在继承中派生类成员函数的访问权限测试
- 【提问整理】protected继承,派生类对象如何访问基类成员?
- 派生类可以恢复继承成员的访问级别, 但不能使访问级别比基类中原来指定的更严格或更宽松 [C++Primer Page484 : 2去除个别成员]
- C++的继承操作---基类指针访问派生类问题---基类成员恢复访问属性问题
- 第十三周 项目一:理解基类中成员的访问限定符和派生类的继承方式
- C++第十三周任务-项目一(理解基类中成员的访问限定符和派生类的继承方式)