我正在尝试使用指向派生类的指针从派生类函数中调用虚函数。在基类中,它是一个纯虚函数,但派生类对其进行了定义。但是,我收到一个链接器错误,指出该函数未定义。编译器知道该定义,因为当我注释掉该定义时,它抱怨派生类是抽象的。
我的代码比下面的代码要复杂得多,但是在试图隔离该错误的过程中,我将其缩小为正在生成链接器错误的确切位。有什么想法吗?
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;
}
答案 0 :(得分:2)
这样做:
Base::func(static_cast<Base*>(arg));
您正在调用Base
的{{1}}版本,该版本显然不存在。
相反,您可能是想致电func()
,您可以简称为Derived::func()
func()
答案 1 :(得分: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;
}