C++ 虚拟与纯虚拟基类函数以及从dll导出
我在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: //
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中特定步骤的前身,那有点奇怪。如果基类中有默认实现,为什么要强制派生类重写它?如果希望始终执行前导,则需要一个公共非虚拟函数来执行前导,然后调用一个私有纯虚拟函数。派生类然后实现这个私有函数,但不能直接调用它,因为它是基类私有的。