使用C ++导出重载函数

时间:2014-12-11 23:05:06

标签: c++ inheritance dll shared-libraries overloading

我在这个问题上有很多线索,但我仍然想念整个画面。 假设我有一个这样的程序结构,我想将项目构建为共享库:

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(甚至更复杂),这个构造函数是否仍然可以工作?

1 个答案:

答案 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接口。