是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?
Can you use using to redeclare a public member in base class as private in derived class?
此代码片段演示了更改类成员访问权,来自 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::z
private
。这是怎么回事?
这篇文章似乎错了。它说,
不能使用 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 都无法编译代码。
相关文章:
- 使用静态成员声明类时遇到问题
- 错误 C2059:语法错误:从结构成员声明'constant'
- std::d eclare_if 或其他在编译时丢弃成员声明的假设方法
- C++ 成员声明中不允许使用限定名称
- 又一个"未找到成员声明"
- auto f = bind(dist<>,gen) 在成员声明C++失败。未被识别为函数
- C++错误:成员声明末尾的预期“;”
- 静态成员声明 c++11
- 如何将成员声明为指向外部"C"函数的指针?
- C++11 - 将非静态数据成员声明为 'auto'
- 类成员声明的快捷方式
- libclang 获取成员声明
- 将成员声明与enable_if一起使用
- 找不到成员声明
- C++错误:找不到成员声明
- 找不到c++成员声明
- 成员声明顺序在类中如果彼此依赖,则为最优解
- 将struct的成员声明为uint32_t时额外的字节
- 为什么类的大小取决于成员声明的顺序?以及如何
- 是成员声明`decltype(name)name;`在第一个名称引用封闭作用域的本地结构中允许