假设我有一些这样的代码:
class Base {
public:
virtual int Foo(int) = 0;
};
class Derived : public Base {
public:
int Foo(int);
virtual double Foo(double) = 0;
};
class Concrete : public Derived {
public:
double Foo(double);
};
如果我有一个Concrete类型的对象,为什么我不能调用Foo(int)?
如果我更改了Foo的名称(double)以便它不会重载Foo,那么一切都很好并且两种方法都可以访问,但这不是我想要的。
类似地,如果我在Derived中删除Concrete类并实现Foo(double),那么两者都是可访问的,但同样不是我想要的。
答案 0 :(得分:17)
名称查找在重载解析之前发生,因此在Foo
中找到Concrete
后,基类将不会搜索名为Foo
的其他方法。 int Foo(int)
中的Derived
隐藏了Foo
中的Concrete
。
您有很多选择。
将通话更改为显式。
concrete.Derived::Foo(an_int);
向Concrete添加using声明。
class Concrete : public Derived {
public:
using Derived::Foo;
double Foo(double);
};
通过基准参考调用该函数。
Derived& dref = concrete;
dref.Foo(an_int);
答案 1 :(得分:6)
Foo(double)
隐藏了你的基地的功能。你可以看到它:
class Concrete : public Derived
{
public:
using Derived::Foo;
double Foo(double);
};