【问题标题】:virtual vs pure virtual base class functions and exporting from dll虚拟 vs 纯虚拟基类函数和从 dll 导出
【发布时间】:2016-10-21 05:03:46
【问题描述】:

我在 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

【问题讨论】:

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

标签: c++ inheritance virtual-functions


【解决方案1】:

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

只有当基类的纯虚函数被显式调用时才会发生这种情况。否则,不需要执行。

例如你是否将Derived::doSomethingElse() 实现为:

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

   // Then do derived stuff
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2010-11-21
    • 2011-03-21
    • 2010-10-23
    • 2016-02-05
    相关资源
    最近更新 更多