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声明所在的访问标号决定,与基类中的访问权限无关,也与派生列表中的访问标号无关。

posted on 2012-05-29 21:24  york_hust  阅读(698)  评论(0编辑  收藏  举报