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)那么,怎么会有隐藏规则呢?
嗯,所有三个答案似乎都很好,并且显示了隐藏规则的不同理由.我不确定我应该接受哪个答案.
我不知道原来的理由,但是因为隐藏或不隐藏是关于同样糟糕的选择.对于函数,我猜测的理由是有统一的规则:与嵌套的花括号范围中定义的名称相同.
隐藏在某些方面帮助你.
默认情况下,向基类添加方法不会影响派生类的重载解析.
并且你不会因为使用say参数将你的调用false指向一个带有正式参数的基类方法的一些事故而与重载解析相冲突void*.这样的事情.
干杯和hth.,
我确定我已经看到这个由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.
| 归档时间: |
|
| 查看次数: |
2175 次 |
| 最近记录: |