【发布时间】:2011-06-17 18:25:43
【问题描述】:
C++ 中hiding rule 背后的基本原理是什么?
class A { void f(int); }
class B : public A { void f(double); } // B::f(int) is hidden
-
如果这是一个有意义的功能,我认为它也应该可以隐藏函数而不定义具有相同名称的新函数:像这样:
class B : public A { hide void f(double); }但这是不可能的。
-
我认为它不会简化编译器的工作,因为当您明确使用
using指令时,编译器必须能够取消隐藏函数:class B : public A { using A::f; void f(double); } // B::f(int) NOT hidden
那么,怎么会有隐藏规则呢?
嗯,这三个答案似乎都不错,并且显示了隐藏规则的不同理由。我不确定我应该接受哪个答案。
【问题讨论】:
-
虽然该决定不是基于简化编译器编写者的生活,但编译器仍需要取消隐藏的论点是无效的。当编译器使用 using 解析类时,它会将所有
A::f带入类的内存表示中。当它试图解析一个调用时,它只需要返回到需要的地方,直到它找到第一次出现的标识符。没有必要通过可能的多条路径继续返回以将所有可能的标识符纳入范围。成员方法将隐藏命名空间级别函数的事实也是如此...... -
AFAIK,隐藏而不定义新函数在 C++11 中通过
=delete是可能的。 -
有一种隐藏基类函数的机制。使用
class A : protected B { ... };而不是public。对不起打死马了。
标签: c++ language-design hide rationale