C++ 虚拟与纯虚拟基类函数以及从dll导出

C++ 虚拟与纯虚拟基类函数以及从dll导出,c++,inheritance,virtual-functions,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: //

我在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定义,因为我没有显式导出基类,该定义对另一个模块中的派生类不可用

但是为什么这个问题不会发生在纯虚拟函数中(它也可以有一个定义)

p.S我正在使用VS2013

但是为什么这个问题不会发生在纯虚拟函数中(它也可以有一个定义)

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

例如,您是否将
派生::doSomethingElse()
实现为:

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

   // Then do derived stuff
}

对于
Base::doSomethingElse
您也会看到同样的问题。

为什么要在Base的.cpp文件中为标头中声明为纯虚拟的函数添加定义?你能澄清你所说的“可能有定义”是什么意思吗?然后你会删除声明中的
=0
吗?如果我希望客户端总是覆盖,但他们可以使用我的公共步骤(base impl)作为他们在Derived中特定步骤的前身,那有点奇怪。如果基类中有默认实现,为什么要强制派生类重写它?如果希望始终执行前导,则需要一个公共非虚拟函数来执行前导,然后调用一个私有纯虚拟函数。派生类然后实现这个私有函数,但不能直接调用它,因为它是基类私有的。