c++类继承中的using声明,派生类中用using声明改变基类成员的访问权限[zz]
以下观点用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声明所在的访问标号决定,与基类中的访问权限无关,也与派生列表中的访问标号无关。