继承接口时未解析的符号

Leo*_*Hat 1 c++ inheritance linker interface unresolved-external

这是在深夜这里,我疯了试图解决链接器错误.

如果我有以下抽象接口:

class IArpPacketBuilder
{
public:

    IArpPacketBuilder(const DslPortId& aPortId);
    virtual ~IArpPacketBuilder();

    // Other abstract (pure virtual methods) here...
};
Run Code Online (Sandbox Code Playgroud)

我像这样实例化它:

class DummyArpPacketBuilder
    : public IArpPacketBuilder
{

public:

    DummyArpPacketBuilder(const DslPortId& aPortId)
        : IArpPacketBuilder(aPortId) {}
    ~DummyArpPacketBuilder() {}
};
Run Code Online (Sandbox Code Playgroud)

为什么我在链接时遇到以下错误?

Unresolved symbol references:

IArpPacketBuilder::IArpPacketBuilder(DslPortId const&):
    ppc603_vxworks/_arpPacketQueue.o
IArpPacketBuilder::~IArpPacketBuilder():
    ppc603_vxworks/_arpPacketQueue.o
typeinfo for IArpPacketBuilder:
    ppc603_vxworks/_arpPacketQueue.o
*** Error code 1
Run Code Online (Sandbox Code Playgroud)

IArpPacketBuilder是一个抽象的接口,所以只要我在具体(派生)接口中定义构造函数和析构,我应该没问题,不是吗?好吧它似乎没有.

Pét*_*rök 5

您只声明了构造函数和析构函数IArpPacketBuilder,而没有定义它们.链接器也需要定义.请注意,C++没有抽象接口的概念- IArpPacketBuilder是一个普通的旧类,碰巧包含一些纯虚方法,因此无法实现直接实例化.

所以最简单的解决方案是提供内联实现:

class IArpPacketBuilder
{
public:

    IArpPacketBuilder(const DslPortId& aPortId) {}
    virtual ~IArpPacketBuilder() {}

    // Other abstract (pure virtual methods) here...
};
Run Code Online (Sandbox Code Playgroud)

您也可以将析构函数设置为纯虚拟,但即便如此,您需要为其提供定义,例如

class IArpPacketBuilder
{
public:

    IArpPacketBuilder(const DslPortId& aPortId) {}
    virtual ~IArpPacketBuilder() = 0;

    // Other abstract (pure virtual methods) here...
};

IArpPacketBuilder::~IArpPacketBuilder() {}
Run Code Online (Sandbox Code Playgroud)