在c++中导出没有基类的父类
Export Parent Class Without Base Class in C++
给定Foo
和Bar
类,其中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
我是这样解决这个问题的。我使Foo
和Bar
单独的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对象。
- std::具有相同基类的类的变体
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 在运行时选择父类的实现
- C++ 不能使用与私有基相同的类
- 如何在C++子类中访问父类的私有变量
- 如何在从抽象基派生的类中实现相同的方法?
- 将父类的子类的数据复制到具有相同父类的另一个类
- 错误:基类在从基类父派生类 Son 时未定义
- 当父类共享指针为返回类型时返回新的基类
- 父类父类中的虚函数
- 使用继承时,是否必须"#include"子类父类的头文件。 C++
- 在c++中导出没有基类的父类
- 如何将基类仅链接到其顶级模板化父类
- 从父类调用基类重载操作符
- 正确的方法使基类设置父类
- 错误:基类构造函数必须显式初始化父类构造函数