【发布时间】: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