【问题标题】:Can you use using to redeclare a public member in base class as private in derived class?您可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员吗?
【发布时间】:2020-09-07 17:17:44
【问题描述】:

这段代码 sn-p 演示更改类成员访问权限来自IBM

struct A {
protected:
  int y;
public:
  int z;
};

struct B : private A { };

struct C : private A {
public:
  using A::y;
  using A::z;
};

struct D : private A {
protected:
  using A::y;
  using A::z;
};

struct E : D {
  void f() {
    y = 1;
    z = 2;
  }
};

struct F : A {
public:
  using A::y;
private:
  using A::z;
};

int main() {
  B obj_B;
//  obj_B.y = 3;
//  obj_B.z = 4;

  C obj_C;
  obj_C.y = 5;
  obj_C.z = 6;

  D obj_D;
//  obj_D.y = 7;
//  obj_D.z = 8;

  F obj_F;
  obj_F.y = 9;
  obj_F.z = 10;
}

根据文章,修改obj_F.z是允许的,因为F类中的using声明不生效,所以F::z仍然是public

但是,当我将它插入Compiler Explorer 时,它不会编译,说F::zprivate。这是怎么回事?

【问题讨论】:

  • 当继承为public 时,using 不会影响继承的public 成员的访问。将using 放入派生类的private 部分不会使成员private。如果要将基类private 的成员变为派生类,请使用private 继承。名称 F::z 是您班级 F 的私人成员,但 A::z 不是。

标签: c++ language-lawyer using using-declaration


【解决方案1】:

文章似乎有误。它说,

您不能使用 using 声明来限制对 x 的访问。

但我在标准中找不到这样的声明。 [namespace.udecl]/19

使用声明创建的同义词具有通常的可访问性 成员声明。

[示例:

class A {
private:
    void f(char);
public:
    void f(int);
protected:
    void g();
};

class B : public A {
  using A::f;       // error: A​::​f(char) is inaccessible
public:
  using A::g;       // B​::​g is a public synonym for A​::​g
};

—结束示例]

即使示例增加了可访问性,但标准并没有说不能限制可访问性。

PS:clanggcc 都无法编译代码。

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 2018-08-23
    • 2018-05-07
    • 1970-01-01
    • 2014-12-05
    • 2021-03-08
    • 2012-09-17
    • 2013-10-10
    相关资源
    最近更新 更多