__declspec(dllimport/dllexport)和继承

5

给定以下类的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个回答

5

Derived类不会被你的DLL导出。类没有继承导出。也要加上DLLAPI。

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

无论如何,如果你在DLL内部实例化了一个Derived(通过另一个入口点),虚表仍然应该起作用,所以如果你这样做:

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

你需要调用Derived::B()。


3

你可以在Visual Studio命令行窗口中输入以下命令来查找:

link /dump /exports <yourdll>

如果它们被导出,你将会看到函数的“装饰名称”。要以可读的方式查看它们,请复制粘贴一个并执行。
undname <decorated name>

1

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接