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

Export Parent Class Without Base Class in C++

本文关键字:基类 父类 c++      更新时间:2023-10-16

给定FooBar类,其中Bar来自Foo,我如何导出Bar而不必导出Foo ?


foo。

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。

这样不行吗?它应该。仅仅因为没有显式导出类并不意味着逻辑不在二进制文件中。这些符号对于导入该类的任何东西都是不可见的。

你的解决方案应该可以。是链接错误还是什么?

编辑:我只是看到你只包括头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

Foo需要创建一个Bar实例——实际上,要创建Bar, Foo的构造函数在Bar的构造函数之前被调用。

我非常怀疑你可以导出一个而不导出另一个。

我不知道这有什么用?

如果你只是想对你的客户隐藏Foo(就像我有时做的那样,但不是对Foo),只要像往常一样导出它…

创建一个Dll(链接Foo.cpp到你的Bar.dll),并从你提供的库/Dll文件的头文件中杀死Foo类。

继承的类对dll的用户是不可见的(当你不选择用#define EXTERNAL __declspec(dllexport)导出该类的方法时)

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

放轻松;)

正如前面提到的,您不能按照您建议的方式来做。

您能提供您的用例的描述吗?也许其他的决定会有帮助?F.ex。如果你需要在dll外部传递Bar对象,你可以为它创建接口并显示它,而不是Bar对象。