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是一个抽象的接口,所以只要我在具体(派生)接口中定义构造函数和析构,我应该没问题,不是吗?好吧它似乎没有.
您只声明了构造函数和析构函数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)