我有两个类,基类A和派生类B。定义如下:

Class A {
public:
    A()
    {
        ImpleDefinition();
    }
    ~A()=default:

protected:
    virtual void ImplDefinition()=0;
}

class B : public A
{
public:
    B() : A()
    {
    }
    ~B()=default;

private:
    void ImplDefinition() override
    {
        /*Some detailed implementation*/
    }
}

因此,在编译此代码时,编译器会报告“错误LNK2001:无法解析的外部符号”错误。从代码本身,我看不到我犯了任何错误。有趣的是,如果我将“ImplDefinition”从纯虚函数更改为虚函数。
void ImplDefinition() {};

然后一切正常。如何解释这种情况?

最佳答案

问题是您要在ImplDefinition()中调用虚拟函数A::A()。当在基类的构造函数中,当前对象始终是基类的子对象时,则根本不构造派生的类部分;稍后将执行。然后将调用纯虚拟A::ImplDefinition()并导致错误;这里没有动态调度,因此根本不会调用B::ImplDefinition()

进一步阅读When my base class’s constructor calls a virtual function on its this object, why doesn’t my derived class’s override of that virtual function get invoked?

关于c++ - 声明纯虚函数时C++ LNK2001错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46230368/

10-12 23:51