使用声明修改派生类中的访问说明符

using declarations for modifying access specifiers in derived class

本文关键字:访问 说明符 派生 声明 修改      更新时间:2023-10-16

c++作为面向对象语言的主要设计原则之一是让每个类强制谁可以访问它的内部,谁不能。基类控制它的访问级别,即使它是相对于嵌入在基类派生的类的对象中的基类对象。

然而,我读到使用声明可以被允许在派生类中更改基类成员的访问级别。

class A{
    protected:
    int n;
};
class B:protected A{
    public:
    using  A::n;
};
int main(){
    B obj;
    obj.n=0;
}
在上面的示例中,我在派生类中将受保护成员的访问级别更改为public。这是允许的吗?为什么不能强制访问级别应该更严格或等于基类中的访问级别(这也可以通过派生列表中的访问资格来控制),而不能比基类中的访问级别更宽松呢?这是允许的吗,因为这允许一些有趣的设计模式?我只是想理解为什么像这样的东西打破了一个类强制封装的原则是允许的?

原因之一是,即使您不是基类的所有者,也可以通过这种方式更改可见性修饰符。例如,如果基类包含在外部库/框架中,您可以更改可见性修饰符。