C++ 编译器要求接口虚拟构造函数?

C++ 编译器要求接口虚拟构造函数?,c++,interface,C++,Interface,我正在努力实现类似于所解释的东西 我有一个接口类定义为: class IInterface { public: virtual bool foo() = 0; virtual void destroy() = 0; } class MyImplementation : public IInterface { MyImplementation(); ~MyImplementation(); virtual bool foo(); virtual

我正在努力实现类似于所解释的东西

我有一个接口类定义为:

class IInterface
{
public:

    virtual bool foo() = 0;
    virtual void destroy() = 0;
}
class MyImplementation : public IInterface
{
    MyImplementation();
    ~MyImplementation();

    virtual bool foo();
    virtual void destroy() {delete this;}

private:

    MyImplementation(MyImplementation const&);
    void operator=(MyImplementation const&);
}

extern "C" API MyInterface* __cdecl createMyImplementation();
和实现类定义为:

class IInterface
{
public:

    virtual bool foo() = 0;
    virtual void destroy() = 0;
}
class MyImplementation : public IInterface
{
    MyImplementation();
    ~MyImplementation();

    virtual bool foo();
    virtual void destroy() {delete this;}

private:

    MyImplementation(MyImplementation const&);
    void operator=(MyImplementation const&);
}

extern "C" API MyInterface* __cdecl createMyImplementation();
这在使用VS2010的发布模式下工作正常,但在调试模式下,编译器会给出以下错误:

MyImplementation.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall IInterface::IInterface(void)" (__imp_??0IInterface@@QAE@XZ) referenced in function "public: __thiscall MyImplementation::MyImplementation(void)" (??0MyImplementation@@QAE@XZ)
问题是什么?我如何解决这个问题

根据我的理解,我们不应该有虚拟构造函数。。。看

编辑:

修正了打字错误。foo确实有一个主体,这是真实代码的简化版本

解释销毁功能的原因:

你在干什么?自杀? 小心


在您的例子中,MyImplementation::foo需要有一个定义的主体,这就是为什么会出现链接器错误的原因。您的问题似乎是链接中没有包含IInterface.obj文件。在发布模式下,编译器会意识到ctor是空的,并删除对它的调用。但是,如果要单步执行它,就必须有一个ctor。我猜您刚刚使用了.h文件。

您可能应该使用一个虚拟析构函数,而不是销毁成员。您得到的链接器错误对项目的对象文件/库/DLL组织高度敏感。到目前为止,你没有提供任何细节。更好地描述它。您的声明是如何分布在源文件中的?因此,尽管大家都认为您的模式很糟糕,但,我不认为这会导致您看到的错误…您如何在MyImplementation中包含IInterface?我在错误消息中没有看到任何地方暗示您需要虚拟构造函数-只是说它找不到接口类的任何构造函数。这有点奇怪,因为缺少任何用户定义的构造函数会导致内联公共默认构造函数…@NeilKirk我知道这一点。我只是对OP如何在错误消息和荒谬的术语virtual constructor.False之间做出不合逻辑的跳跃感到困惑。MyImplementation::foo从未在链接器错误中提到过。+1可能是因为该函数需要消除死代码,所以该错误隐藏在发布版本中。我相信这是正确的答案。我使用GCC,并根据,为virtualboolfoo{}定义了一个空的主体,修复了这个错误。将验证类中的每个函数是否都有一个主体。至于销毁,我指的是这个,从这里开始