虚拟与纯虚拟基类功能以及从dll导出

时间:2016-06-20 03:02:33

标签: c++ inheritance virtual-functions

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

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()没有被覆盖,派生类需要访问Base :: doSomething定义,因为我没有显式地导出Base类,所以派生它不可用于另一个模块。

但是为什么纯虚函数不会发生这个问题(它也可能有定义)?

P.S 我正在使用VS2013

1 个答案:

答案 0 :(得分:4)

  

但是为什么纯虚函数不会发生这个问题(它也可能有定义)?

只有在显式调用基类的纯虚函数时才会发生这种情况。否则,没有必要实施。

E.g。您是否已将Derived::doSomethingElse()实施为:

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

   // Then do derived stuff
}

你也会看到Base::doSomethingElse同样的问题。