5

给定一个具有以下类的 DLL:

#define DLLAPI __declspec(...)

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

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

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

“D()”函数是否可见?

谢谢

4

4 回答 4

5

类 Derived 不会被您的 DLL 导出。类不继承导出。也向其中添加 DLLAPI。

还要注意,类成员默认为私有可访问性,因此您的任何方法都不应该是可访问的。但是,我确实看到 Base::B() 在我的测试中被导出。使用 DLL 的代码中的 C++ 标头会标记错误,但我想知道您是否在那里调整了标头,是否可以欺骗它。

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

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

你会调用 Derived::B()。

于 2009-08-12T18:26:33.063 回答
3

您可以通过键入从 Visual Studio 命令外壳中查找

link /dump /exports <yourdll>

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

undname <decorated name>
于 2009-08-12T18:20:11.517 回答
1

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

于 2009-08-12T18:23:02.557 回答
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.
于 2014-08-26T09:30:11.257 回答