【发布时间】: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::z 是private。这是怎么回事?
【问题讨论】:
-
当继承为
public时,using不会影响继承的public成员的访问。将using放入派生类的private部分不会使成员private。如果要将基类private的成员变为派生类,请使用private继承。名称F::z是您班级F的私人成员,但A::z不是。
标签: c++ language-lawyer using using-declaration