如何从派生类函数中调用虚拟函数

问题描述 投票:0回答:2

我正在尝试使用指向派生类的指针从派生类函数中调用虚函数。在基类中,它是一个纯虚函数,但派生类对其进行了定义。但是,我收到一个链接器错误,指出该函数未定义。编译器知道该定义,因为当我注释掉该定义时,它抱怨派生类是抽象的。

我的代码比下面的代码要复杂得多,但是在尝试隔离该错误时,我将其缩小为生成链接器错误的确切位。有什么想法吗?

struct Derived;

struct Base
{
  virtual Derived*func( Base*)=0;
  virtual ~Base(){}
};

struct Derived : Base
{
  Derived*func(Base*)
  {
    // do stuff here
    return nullptr; // actual code returns a non-null
  }

  Derived*operate( Derived*arg)
  {
    // do stuff here
    return Base::func(static_cast<Base*>(arg));
  }
};

int main()
{
  Derived *pt = new Derived();
  pt->operate(nullptr); // linker error
  pt->func(nullptr);    // okay, compiles and runs as expected
  return 0;
}
c++ linker-errors virtual-functions undefined-reference derived-class
2个回答
2
投票

通过:

Base::func(static_cast<Base*>(arg));

您正在调用Basefunc()版本,该版本显然不存在。

相反,您可能想调用Derived::func(),您可以将其简称为func()

func(static_cast<Base*>(arg));

0
投票

您正在调用已定义为纯虚函数的基本函数。该代码应如下所示:

struct Derived;

struct Base
{
  virtual Derived*func( Base*)=0;
  virtual ~Base(){}
};

struct Derived : Base
{
  Derived*func(Base*) override
  {
    // do stuff here
    return nullptr; // actual code returns a non-null
  }

  Derived*operate( Derived*arg)
  {
    // do stuff here
    return this->func(arg);
  }
};

int main()
{
  Derived *pt = new Derived();
  pt->operate(nullptr); // linker error
  pt->func(nullptr);    // okay, compiles and runs as expected
  return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.