gpt4 book ai didi

c++ - 为什么在 main() 中下面的表达式 `d.f(1);` 没有歧义?

转载 作者:搜寻专家 更新时间:2023-10-31 00:16:02 24 4
gpt4 key购买 nike

为什么 base::f(int)main() 中下面的表达式 d.f(1); 没有歧义Derived::f(int) ?

class Base
{
public:
void f(int i) {}
void f(int i, int j) {}
};

class Derived : public Base
{
public:
using Base::f;
void f(int i) {}
};

int main()
{
Derived d;
d.f(1);
}

最佳答案

正如其他人所写,没有歧义,因为 Derived::f(int) 隐藏了 Base::f(int)。您可能希望只有在没有 using 声明的情况下才会出现这种情况:

using Base::f;

但隐藏仍然适用。 C++11 标准第 7.3.3/15 段规定:

When a using-declaration brings names from a base class into a derived class scope, member functions and member function templates in the derived class override and/or hide member functions and member function templates with the same name, parameter-type-list (8.3.5), cv-qualification, and ref-qualifier (if any) in a base class (rather than conflicting).

它还提供了一个与您的示例非常相似的示例(请参阅表达式 p->f(1) 如何不会导致歧义,而 D::f 是取而代之):

struct B {
virtual void f(int);
virtual void f(char);
void g(int);
void h(int);
};

struct D : B {
using B::f;
void f(int); // OK: D::f(int) overrides B::f(int);
using B::g;
void g(char); // OK
using B::h;
void h(int); // OK: D::h(int) hides B::h(int)
};

void k(D* p)
{
p->f(1); // calls D::f(int)
p->f(’a’); // calls B::f(char)
p->g(1); // calls B::g(int)
p->g(’a’); // calls D::g(char)
}

关于c++ - 为什么在 main() 中下面的表达式 `d.f(1);` 没有歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17602149/

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