导出具有C++的重载函数
export overloaded functions with C++
关于这个主题,我已经有很多话题了,但我仍然想念整个画面。假设我有一个这样的程序结构,我想将项目构建为共享库:
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 接口。
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?