【发布时间】:2014-01-02 22:55:04
【问题描述】:
我已经阅读了解释如何从 D 调用 C++ 的文档:http://dlang.org/cpp_interface.html。然而,有几件事对我来说不是很清楚。
以D网站提供的例子为例:
#include <iostream>
using namespace std;
class D {
public:
virtual int bar(int i, int j, int k)
{
cout << "i = " << i << endl;
cout << "j = " << j << endl;
cout << "k = " << k << endl;
return 8;
}
};
D *getD() {
D *d = new D();
return d;
}
然后可以从 D 调用 C++ 类,如下所示:
extern (C++) {
interface D {
int bar(int i, int j, int k);
}
D getD();
}
void main() {
D d = getD();
d.bar(9,10,11);
}
我不太清楚 C++ 对象是如何被删除的。 D 垃圾收集器是否在 C++ 对象上调用 delete,或者我们是否需要提供一个“删除器”函数来删除对象并从 D 中手动调用它?在我看来,如果我向 C++ 类添加一个析构函数,它就永远不会被调用。我还注意到 C++ 类必须以与在 D 接口中声明的顺序完全相同的顺序声明成员函数(例如,如果我在 bar() 方法之前添加析构函数,则无法从 D 调用 C++ 对象,但是如果在 bar() 方法之后声明了析构函数,则一切正常)。
如果D接口定义为:
extern(C++){
interface D{
int bar();
int foo();
}
}
对应的C++类由下式给出:
class D{
public:
virtual int bar(){};
virtual int foo(){};
};
如何保证 C++ 虚方法 vtbl 将按照与 D 接口中声明的方法相同的顺序创建。对我来说,对此没有任何保证。换句话说,我们如何确定 D::bar() 将位于 vtbl 中的第一个位置?这不依赖于实现/编译器吗?
【问题讨论】: