在C ++中导出没有基类的父类

时间:2011-11-28 20:14:18

标签: c++ dllexport

鉴于FooBarBar来自Foo,我怎样才能导出Bar而无需导出Foo


foo.h中

class Foo
{
    public:
        Foo();
        virtual bool Read(...);
        virtual bool Write(...);
        ~Foo();
};


Bar.h

#ifdef BUILD_DLL
#    include "Foo.h"
#    define EXTERNAL __declspec(dllexport)
#else
#    define EXTERNAL __declspec(dllimport)
#endif 

class EXTERNAL Bar: public Foo
{
    public:
        Bar();
        bool Read(...);
        bool Write(...);
        ~Bar();
};



修改

这是Visual C ++ 2010给我的警告:

  

警告C4275:非dll接口类'Foo'用作dll接口类'Bar'的基础



编辑#2

这就是我解决问题的方法。我将FooBar分开了DLL。客户端应用程序链接到Bar.dll和Bar.dll链接到Foo.dll。这适用于我想要实现的目标......

4 个答案:

答案 0 :(得分:3)

这不起作用吗?这应该。仅仅因为你没有明确地导出类并不意味着逻辑不在二进制文件中。导入该类的任何内容都不会显示这些符号。

您的解决方案应该这样做。您是否收到链接错误或什么?

编辑:我刚看到你只在一个案例中包含了Foo的标题。你不需要这样做:

#ifdef BUILD_DLL
#    define EXTERNAL __declspec(dllexport)
#else
#    define EXTERNAL __declspec(dllimport)
#endif 

#include "Foo.h"

class EXTERNAL Bar: public Foo
{
    public:
        Bar();
        bool Read(...);
        bool Write(...);
        ~Bar();
};

这样您就无法在其他模块中使用Foo,因为它未导出,但您可以使用并声明Bar

答案 1 :(得分:1)

需要Foo来创建一个Bar实例 - 事实上,为了创建Bar,Foo的构造函数在Bar的构造函数之前被调用。

我非常怀疑你可以导出一个并在不导出另一个的情况下使用它。

答案 2 :(得分:1)

我不确定这有什么好处?

如果您只是试图向您的客户隐藏Foo(就像我有时这样做,但不是Foo),只需像往常一样将其导出......

从中创建一个Dll(将Foo.cpp链接到您的Bar.dll)并从您使用库/ Dll文件传递的标头中删除Foo类。

dll的用户看不到一个被编程的类(当你不选择使用#define EXTERNAL __declspec(dllexport)导出这个类的方法时。

所以:Foo对用户/客户隐藏。

放松一下;)

答案 3 :(得分:0)

如前所述,你不能按照你的建议做到这一点。

您能否提供您的用例说明?可能其他一些决定会有所帮助吗? F.ex.如果你需要在dll之外传递Bar对象,你可以创建它的接口并显示它而不是Bar对象。