虚拟与纯虚拟基础 class 函数和从 dll 导出

virtual vs pure virtual base class functions and exporting from dll

我在 dll 中定义了一个基 class,如下所示:

class Base
{
   public:
      virtual void doSomething(); // Definition in cpp
      virtual void doSomethingElse() = 0; // May have a definition in cpp
};

在另一个dll中,我从Base派生并实现了必要的方法

class Derived : public Base
{
  public:
     // Use base implementation for doSomething
     void doSomethingElse() override;
}

我收到 Base::doSomething() 的链接器错误无法解析的外部符号。

据我所知,由于没有覆盖 doSomething(),派生的 class 需要访问 Base::doSomething 定义,因为我没有明确导出 Base class , 对另一个模块中的派生不可用。

但是为什么纯虚函数不会出现这个问题(它也可以有一个定义)?

P.S我用的是VS2013

But why this problem doesn't happen with pure virtual function(it too could have a definition)?

只有显式调用基 class 的纯虚函数才会发生这种情况。否则不必执行。

例如您是否将 Derived::doSomethingElse() 实施为:

void Derived::doSomethingElse()
{
   // Do base class stuff first.
   Base::doSomethingElse();

   // Then do derived stuff
}

您也会在 Base::doSomethingElse 中看到同样的问题。