将C++类转换为Delphi

3

我将一些C++代码翻译成Delphi,有一些需要翻译的抽象类。这些类被用作参数/返回类型等,我的问题是,如果一个C++类层次结构如下:

class Thing {
    virtual void blah() = 0;
};

class Thing2 : public Thing {
    virtual bool asdf(Thing*) = 0;
};

可以用Delphi重写为:

Thing = class
    procedure blah; virtual;
end;

Thing2 = class(Thing)
    function asdf(Thing) : Boolean; virtual;
end;

Delphi代码可以调用接受C++ Thing*s的C++函数,反之亦然。同样地,如果进行了上述翻译,那么C++ Thing2*是否等于Delphi Thing2,使得Delphi可以调用它的方法等呢?


2
你可能想阅读Rudy Velthuis的文章“在Delphi中使用C++对象”(http://rvelthuis.de/articles/articles-cppobjs.html)。 - Uli Gerhardt
1个回答

2
不完全正确。在C++中,将方法标记为= 0意味着它是一个抽象方法。在Delphi中,要获得相同的效果,您必须将其标记为virtual; abstract;,而不仅仅是virtual;
此外,在Delphi中,如果您将类成员声明放置在类名下方,它将默认声明为published,这意味着它是公共的加上RTTI为其生成。这可能不是您的意图,因此请先放置可见性范围声明(private,protectedpublic):
Thing = class
public
    procedure blah; virtual; abstract;
end;

Thing2 = class(Thing)
public
    function asdf(Thing) : Boolean; virtual; abstract;
end;

那么在virtual之后添加abstract会使C++中的Thing2*等同于Delphi中的Thing2吗? - John Zane
抱歉,还有一件事,我应该将那些函数标记为stdcall还是cdecl?至于可变参数函数(比如virtual void blah(...)),那些是cdecl对吗? - John Zane
1
@John:等一下,你是想制作一个与C++类匹配的Delphi类,以便在应用程序和DLL之间传递它们并假装它们是等效的吗?不要这样做!还有许多其他细节可能不会正确对齐。如果您想在具有不同对象模型和不同内存管理的语言之间进行此类通信,请研究COM。它就是为此而设计的,并且比尝试将类叠加在彼此上要好得多。 - Mason Wheeler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接