首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__declspec(dllimport/dllexport)和继承

__declspec(dllimport/dllexport)和继承
EN

Stack Overflow用户
提问于 2009-08-12 18:14:47
回答 4查看 4.5K关注 0票数 5

给定一个包含以下类的DLL:

代码语言:javascript
复制
#define DLLAPI __declspec(...)

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

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

即使"DLLAPI“关键字没有应用于类定义(至少不是直接应用),我的”派生“类在dll外部也是可见的吗?

"D()“函数对可见吗?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-12 18:26:33

您的DLL不会导出派生的类。类不继承导出。将DLLAPI也添加到其中。

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

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

代码语言:javascript
复制
Base* b = getTheDerived(); b->B();

您将调用Derived::B()。

票数 5
EN

Stack Overflow用户

发布于 2009-08-12 18:20:12

您可以通过输入以下命令从Visual Studio命令shell中找到答案

代码语言:javascript
复制
link /dump /exports <yourdll>

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

代码语言:javascript
复制
undname <decorated name>
票数 3
EN

Stack Overflow用户

发布于 2009-08-12 18:23:03

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1267811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档