C++:隐藏规则背后的基本原理

peo*_*oro 25 c++ language-design hide rationale

C++中隐藏规则背后的基本原理是什么?

class A { void f(int); }
class B : public A { void f(double); } // B::f(int) is hidden
Run Code Online (Sandbox Code Playgroud)
  • 如果它是一个有意义的功能,我认为也应该可以隐藏功能而无需定义具有相同名称的新功能:如下所示:

    class B : public A { hide void f(double); }
    
    Run Code Online (Sandbox Code Playgroud)

    但这是不可能的.

  • 我不认为它简化了编译器的工作,因为编译器必须能够在显式使用指令时取消隐藏函数using:

    class B : public A { using A::f; void f(double); } // B::f(int) NOT hidden
    
    Run Code Online (Sandbox Code Playgroud)

那么,怎么会有隐藏规则呢?


嗯,所有三个答案似乎都很好,并且显示了隐藏规则的不同理由.我不确定我应该接受哪个答案.

650*_*502 10

这是一个毛茸茸的问题,但显然这个想法是这个隐藏功能有助于在更改基类时避免细微的错误(否则可以"窃取"之前由派生类处理的调用).基类中的更改仍会影响派生类编译的结果,因此我认为我不理解100%这种解释.

我同意这个主题经常被讨论,可能隐藏实际上增加了C++程序员的"惊喜"数量.

关于这个问题的详细讨论可以在这里找到......


Che*_*Alf 9

我不知道原来的理由,但是因为隐藏或不隐藏是关于同样糟糕的选择.对于函数,我猜测的理由是有统一的规则:与嵌套的花括号范围中定义的名称相同.

隐藏在某些方面帮助你.

默认情况下,向基类添加方法不会影响派生类的重载解析.

并且你不会因为使用say参数将你的调用false指向一个带有正式参数的基类方法的一些事故而与重载解析相冲突void*.这样的事情.

干杯和hth.,


Ste*_*sop 7

我确定我已经看到这个由C++ bigwig提供的案例,不知道哪个:

struct Base {
    void f(const Base&);
};

struct Derived : Base {
    using Base::f;
    void f(double);
};

int main() {
    Derived d;
    d.f('a'); // calls Derived::f
}
Run Code Online (Sandbox Code Playgroud)

现在,添加void f(int);Base,和的主要变化的意义-它呼吁Base::f,因为int是一个更好的比赛char-这是一个整数的推广,而不是一个标准的转换.

目前尚不清楚程序员是否真的希望对基数进行更改以捕获调用char,因此要求using显式意味着默认行为是更改不会影响调用代码.我认为这是一个微不足道的呼吁,但我认为委员会认为C++中的基类很脆弱,没有这个也是:-)

不需要"隐藏"关键字,因为在Derived中没有重载时,没有类似的情况可以从Base中隐藏"f" .

顺便说一句,我选择了这些类型,char故意不合情理.你可以用intvs unsigned int而不是intvs 获得更微妙的案例char.