1

为什么接口由于私有继承而在方法中具有特殊的可见性?

请注意,我的派生类中需要全局说明符:: 。

我不明白为什么一个方法由于私有继承而继承了某种可见性。Derived 类无法访问 Control 是完全合理的。但为什么它也不能通过成员访问?

class Control
{
public:
    void ModifySomething();
};

class Base : private Control
{
private:
    virtual void Update( Control& i_control );
};

class Derived : public Base
{
private:
    // ----------↓↓
    void Update( ::Control& i_control ) override;
};

注意:我知道我们可以通过组合来解决这个问题。但我想知道为什么它在 C++ 中是这样定义的。我们可以打破 const-ness 还是什么?

4

2 回答 2

3

class Derived无权访问 中的任何内容privateclass Base因此无法访问class Controlthrough Base。但是,它可以Control直接访问,因为它与Derived.

正如@foreknownas_463035818 评论的那样,有两条通往Controlfrom的路径,Derived但一条由于private访问控制而被阻止,因此选择了另一条全局路径。

于 2019-10-14T15:56:52.183 回答
1

根据 C++ 17 标准(14.1 访问说明符)

5 [注意:在派生类中,基类名称的查找将找到注入的类名称,而不是声明它的范围内的基类名称。在声明它的范围内,注入的类名可能比基类的名称更难访问。——尾注]

还有一个类似于您的代码片段的示例。

[例子:

class A { };
class B : private A { };
class C : public B {
  A* p; // error: injected-class-name A is inaccessible
  ::A* q; // OK
};

—结束示例]

即派生类定义中私有基类的注入类名隐藏了命名空间中定义的基类名。这个注入的名字是私有的。因此派生类无法访问此私有注入名称。

于 2019-10-14T17:30:18.023 回答