c++ - 从已在基类中正确定义的子类调用未定义的虚方法时出错

标签 c++

<分区>

:我有以下场景:

// NOTE:  pseudo example only, sorry for the early typos
class Foo
{
  public:
     virtual bool IsItSo();
     virtual bool IsItSo(string x);
};

bool Foo::IsItSo()
{
  return true;
}

class Bar : Foo
{
   public:
     // not here
     virtual bool IsItSo(string x);
};

bool Bar::IsItSo(string x)
{
   return (x == "")
}

class Helper
{
   public:
     void HelperMethod();
};

void Helper::HelperMethod()
{
   Bar *p = new Bar
   // ... hack hack hack
   bool b = p->IsItSo();    //<-- compilation error
}

我得到的具体错误是:

file.cpp(1124) : error C2660: 'Bar::IsItSo' : function does not take 0 arguments

有人可以向我解释一下这种神奇的疯狂吗?

最佳答案

重写适用于具有相同签名的函数,但这实际上是一个转移注意力的问题。

事情是,派生类中的成员函数隐藏基类中具有相同名称(无论签名如何)的成员函数。您的函数是虚拟的这一事实在这里并不重要,因为您不会在任何地方尝试动态调度。

如果你写了:

Foo* f = new Bar;
f->IsItSo();

它会像 f->IsItSo("Oi"); 那样工作(并且它会调用派生类中的函数)。

名称查找开始查找对象的静态类型(在您的例子中,它是 Bar)并在遇到名称时停止查找。从 Bar 可见的唯一 IsItSo 是采用 std::string 参数的那个。

关于c++ - 从已在基类中正确定义的子类调用未定义的虚方法时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21021566/

相关文章:

c++ - 在没有物理连接的情况下写入时,boost async tcp 客户端不会返回错误

c++ - 如何处理可能具有多种类型之一的 Rcpp::XPtr

c++ - 如何抑制从 CommCtrl.h 中提取的 C26454 代码分析?

C++将结构指针转换为类型值

c++ - 字符串比较很奇怪

c++ - 输出或遍历一组的所有对组合的标准算法?

C++ Winsock2 以字节顺序发送整数

c++ - 在使用矩阵进行计算时删除 C++ 二维 vector 行

c++ - 为什么 malloc() 分配的内存比要求的多,我如何禁止 malloc 在 Mac OS X 中执行此操作?

c++ - 完美的转发可变参数模板,为所选类型按值传递