c++ - 使用 C++ 导出重载函数

标签 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 类,或者继承的(非虚拟的)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/

相关文章:

c++ - C/C++中的位操作

python - GeoDjango - 哪些表应该从 django.contrib.gis.db.models 继承?

c++ - 聚合初始化期间无法访问继承的结构成员

java - UnsatisfiedLinkError 用 SWIG 包装 C++ DLL 以允许 Java 开发人员使用它

c++ - 如何让 AssImp 正常工作?

.net - .Net 标准 DLL 项目的构建文件夹中缺少 Nuget Pkg Dll。 dll 不是复制本地的吗?在 Visual Studio 2019 中修复?

C++ header-only 包含模式

c++ - 使用 curl 下载 zip 文件 (c++)

c++ - 如何获取 boost::asio::io_service 当前 Action 号

c# - 使用带参数的基类构造函数继承