我在这个问题上有很多线索,但我仍然想念整个画面。 假设我有一个这样的程序结构,我想将项目构建为共享库:
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类,或者在导出Daughter1和Daughter2时自动“捕获”继承的(非虚拟)foo3 ?我应该在Parent类中有选择地导出该方法吗?
4)假设在另一个类的构造函数中调用Parent(作为引用)...因为Parent无法初始化,所以要点构造函数接受Daughter1和Daughter2。问题是:如果我只导出了Daughter1和Daughter2(甚至更复杂),这个构造函数是否仍然可以工作?
答案 0 :(得分:1)
这是特定于编译器的。
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
要使用相同的标题,要导入和导出类,您可能需要创建一个定义/宏。
编辑:
3& 4,所有基类必须是可导出的,不能从不可导出的类继承可导出的类。它在这里有更详细的描述:http://msdn.microsoft.com/en-us/library/81h27t8c.aspx
从" extern" C""以外的库中导出的函数像这样的块不能从C ++以外的任何语言调用。
如果您希望能够使用其他语言调用这些函数,则必须只导出C函数或导出COM接口。