我有点困惑,我们有一个基类,它具有带有参数和特定参数签名的虚函数。我们试图添加一个具有相同名称但为派生类设置了不同参数的函数,现在,除非我们使用class对其进行命名,否则编译器将看不到基类函数。
class A
{
public:
virtual void AddItem(int i);
}
class B: public A
{
public:
void AddItem(const std::string &i);
void OtherFunction();
}
void B::OtherFunction()
{
// This is a compiler error
AddItem(1);
// We have to do this
A::AddItem(1);
}
为什么带有不同参数包的派生类函数会隐藏基类函数?我以为功能是通过名称AND参数包定义的。
答案:另一篇SO文章的摘要 C ++实现了“名称隐藏”,它仅查看函数的实际名称,而忽略参数包。具有名为“ DoStuff”的函数的派生类将隐藏具有相同名称的所有基类函数,而与参数无关。要从B调用它们,您需要如上所述进行显式定义,或者可以使用using语句将函数“导入”到派生函数中。