gpt4 book ai didi

c++ - 可以从具有相同名称的派生类函数调用基类函数。但我无法从支持此标准的标准中找到引用

转载 作者:行者123 更新时间:2023-12-04 08:28:49 26 4
gpt4 key购买 nike

考虑以下片段:

struct Base{
void f() {}
};

struct Derived: public Base{
void f() { Base::f(); }
};

Derived d;
int main(){
d.f();
}
该片段工作正常。即, d.f()电话 Base::f() .但我无法从支持这一点的标准中找到引用。

最佳答案

以下所有标准引用均引用 N4659: March 2017 post-Kona working draft/C++17 DIS .

这是 [class.qual]/1 [提取,重点 矿]:

If the nested-name-specifier of a qualified-id nominates a class, the name specified after the nested-name-specifier is looked up in the scope of the class [...]


在您的示例中, Base::是嵌套名称说明符,后面指定的名称是 f() ,因此在类 Base 的范围内执行查找.此规则不会受到调用站点上的阴影影响,因为我们使用的是限定名称,并且我们可能会注意到,如果我们删除 f()来自 Base合格的 id 将(如合格查找所预期的那样)不会搜索 f()派生类的作用域。
struct Base {};

struct Derived: public Base {
void f() {
Base::f(); // error: 'f' is not a member of 'Base
}
};
我们还可以注意到 [class.qual]/3特别提到这个案例:

A class member name hidden by a name in a nested declarative region or by the name of a derived class member can still be found if qualified by the name of its class followed by the ​::​ operator.


但正如所指出的 in a comment by @LanguageLawyer ,这一段应该可以说是非规范性的(1)。

(1) [class.qual]/3 给出了 [class.qual]/1 如何应用/它的效果的具体例子。但是,标准中的这些部分通常是非规范的(示例、注释等),而 [class.qual]/3 没有带来“新规范”值(已在 [class.qual] 中涵盖)/1),不作为注释或示例包装。

关于c++ - 可以从具有相同名称的派生类函数调用基类函数。但我无法从支持此标准的标准中找到引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65127825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com