我在这个主题上有很多话题,但我仍然想念整个画面。 假设我有这样的程序结构,我想将项目构建为共享库:
class Parent
{
public:
virtual double foo1() =0;
virtual double foo2() =0;
double foo3();
}
class Daughter1 : public Parent
{
public:
double foo1();
double foo2();
}
class Daughter2 : public Parent
{
public:
double foo1();
double foo2();
}
class evenmorecomplex:
{
public:
evenmorecomplex(const &Parent);
//
}
在很多线程中,我看到有一个声明
extern "C"
{
//functions for which I want to prevent the mangling
}
所以我的问题是双重的:
1) 这种方法不会破坏所有 C++ 对象设计吗?
2) 显然我不能在同一范围内声明两个相同的函数...那么,在这种情况下如何导出所有方法?
谢谢大家会让我更清楚。
[编辑] 还有一些问题……只是为了更好地理解(抱歉,我仍然是 C++ 的新手)……
3) 如果我在 Parent 中有一个非虚拟方法(比如 foo3() ),我是否应该也导出 Parent 类,或者继承的(非虚拟的)foo3 将在导出 Daughter1 和 Daughter2 时自动“捕获” ?我应该在父类中有选择地导出该方法吗?
4) 假设在另一个类的构造函数中调用了 Parent(作为引用)...因为无法初始化 Parent,所以要点是让构造函数同时接受 Daughter1 和 Daughter2。问题是:如果我只导出 Daughter1 和 Daughter2(甚至更复杂),这个构造函数是否仍然有效?
最佳答案
这是特定于编译器的。
extern "C"只有当你想导出 C 风格的函数时才有用,如果你想导出 C 风格的函数,你将无法导出具有 C++ 调用约定的函数(例如任何类函数)
在 Windows/Visual-Studio 上,只需在导出时为您的类添加前缀 __declspec( dllexport ) 或在导入时为您的类添加 __declspec( dllimport ) 前缀,如下所示:
class __declspec( dllexport ) MyClass{
float somefloat = 12.0f;
void fucn();
}
http://msdn.microsoft.com/en-us/library/81h27t8c.aspx
要为类的导入和导出使用相同的 header ,您可能需要创建一个定义/宏。
编辑:
3&4,所有基类都必须是可导出类,不能从不可导出类继承可导出类。此处对其进行了更详细的描述:http://msdn.microsoft.com/en-us/library/81h27t8c.aspx
像这样从“extern“C”” block 之外的库导出的函数不能从 C++ 以外的任何语言调用。
如果您希望能够从不同的语言调用函数,您要么只导出 C 函数,要么导出 COM 接口(interface)。
关于c++ - 使用 C++ 导出重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27434086/