导出具有C++的重载函数

export overloaded functions with C++

本文关键字:重载 函数 C++      更新时间:2023-10-16

关于这个主题,我已经有很多话题了,但我仍然想念整个画面。假设我有一个这样的程序结构,我想将项目构建为共享库:

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(如果我在父级中有一个非虚拟方法(比如foo3((

(,我是否也应该导出父类,或者继承的(非虚拟(foo3将在导出女儿1和女儿2时自动"捕获"?我应该有选择地在父类中导出该方法吗?

4(假设在另一个类的构造函数中调用父(作为参考(...由于无法初始化父级,因此关键是使构造函数同时接受女儿 1 和女儿 2。问题是:如果我只导出 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

若要使用相同的标头来导入和导出类,可能需要创建一个定义/宏。

编辑:

3&4,所有基类必须是可导出的,不能从不可导出的类继承可导出的类。这里更详细地描述了它:http://msdn.microsoft.com/en-us/library/81h27t8c.aspx

像这样的从"extern "C"块之外的库导出的函数不能从除C++以外的任何语言调用。

如果希望能够从其他语言调用函数,则必须仅导出 C 函数或导出 COM 接口。