是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?

Can you use using to redeclare a public member in base class as private in derived class?

本文关键字:成员 声明 派生 using 可以使 基类 是否 新声明      更新时间:2023-10-16

此代码片段演示了更改类成员访问权,来自 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

但是,当我将其插入编译器资源管理器时,它无法编译,说F::zprivate。这是怎么回事?

这篇文章似乎错了。它说,

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

但我无法从标准中找到这样的陈述。[namespace.udecl]/19

由 using-声明创建的同义词具有通常的可访问性 成员声明。

[ 示例:

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:clang 和 gcc 都无法编译代码。