__declspec(dllimport / dllexport)和继承

时间:2009-08-12 18:14:47

标签: c++ windows dll dllimport dllexport

给定具有以下类的DLL:

#define DLLAPI __declspec(...)

class DLLAPI Base
{
    public:
    virtual void B();
};

class Derived : public Base
{
    public:
    virtual void B();
    virtual void D();
};

即使“DLLAPI”关键字未应用于类定义(至少不是直接),我的“Derived”类是否可以在dll之外显示?

“D()”功能是否可见?

由于

4 个答案:

答案 0 :(得分:4)

您的DLL不会导出

类Derived。类不继承导出。同时添加DLLAPI。

另请注意,类成员默认使用私有辅助功能,因此无法访问任何方法。但是,我确实看到Base :: B()在我的测试中被导出。使用DLL的代码中的C ++标题会标记错误,但我想知道你是否在那里调整了标题,如果你可以欺骗它。

无论如何,如果你在你的DLL中实例化了一个Derived(通过另一个入口点),那么虚拟表应该仍然有用,所以如果你这样做了:

Base* b = getTheDerived(); b->B();

你要调用Derived :: B()。

答案 1 :(得分:3)

您可以通过键入

从Visual Studio命令shell中找到
link /dump /exports <yourdll>

如果导出它们,您将看到函数的“装饰名称”。要查看它们的人类可读格式,请复制粘贴一个并执行

undname <decorated name>

答案 2 :(得分:1)

不,Derived在DLL外部不可见。为了导出派生类,您还必须将DLLAPI宏应用于派生类。

答案 3 :(得分:0)

您必须使基类和派生类都可导出,

http://msdn.microsoft.com/en-us/library/81h27t8c.aspx

All base classes of an exportable class must be exportable. If not, a compiler 
warning is generated.