微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何解决“Delphi样式类必须从Delphi样式类派生”?

如何解决如何解决“Delphi样式类必须从Delphi样式类派生”?

如果我有一个类定义为:

// foo.h
class Foo
{
public:
    virtual void GetFoo();
}

我想要一个 TForm 继承它,例如

class TFMainWindow : public TForm,public Foo
{
   ...
}

我收到错误

[bcc32c Error] TFMainWindow.h(36): Delphi 样式类必须从 Delphi 样式类派生

我该如何解决这个问题?

解决方法

TForm 派生自 TObject,它是一个“Delphi 风格的类”,即它是在 Delphi pascal 中实现的,而不是在 C++ 中。在 Delphi 中,TObject 是所有类对象实例的根。

Delphi 不像 C++ 那样支持类的多重继承。只能单继承。 Delphi 类最多只能有 1 个基类。但是,它可以实现多个接口

因此,在 C++Builder 中,当 C++ 类具有 TObject 作为祖先时,任何其他非基祖先必须是 接口,您的 Foo不是。在这种情况下,接口是任何没有数据成员的类,并且只允许纯虚方法和__property声明。

如果 Foo::GetFoo() 是一个 纯虚 方法,那么您的代码将按预期工作,例如:

class Foo
{
public:
    virtual void GetFoo() = 0;
};

class TFMainWindow : public TForm,public Foo
{
    ...
public:
    void GetFoo();
    ...
};

这只是 C++ 和 Delphi 之间如何交互的一个限制。

这是记录在案的行为:

C++ and Delphi Class Models: Inheritance and Interfaces

与 C++ 不同,Delphi 语言不支持多重继承。您创建的任何具有 RTL 祖先的类都会继承此限制。也就是说,您不能为 Delphi 风格的 C++ 类使用多个基类,即使 RTL 类不是直接祖先。

使用接口代替多重继承

对于在 C++ 中使用多重继承的许多情况,Delphi 代码使用接口代替。没有直接映射到 Delphi 接口概念的 C++ 构造。 Delphi 接口就像一个没有实现的类。也就是说,接口就像一个类,其中所有方法都是纯虚拟的,没有数据成员。虽然 Delphi 类只能有一个父类,但它可以支持任意数量的接口。 Delphi 代码可以将类实例分配给任何这些接口类型的变量,就像它可以将类实例分配给任何祖先类类型的变量一样。这允许共享相同接口的类的多态行为,即使它们没有共同的祖先。

在 C++Builder 中,编译器将只有纯虚方法而没有数据成员的类识别为对应于 Delphi 接口。因此,当你创建一个 Delphi 风格的类时,你可以使用多重继承,但前提是所有的基类除了 RTL 或 Delphi 风格的类没有数据成员,只有纯虚方法。

注意:接口类不需要是Delphi风格的类;唯一的要求是它们没有数据成员,只有纯虚方法。

Delphi 和 C++ 之间对象模型的差异也是 C++ 类派生自 TObject MUST be constructed in dynamic memory with new 的原因,尽管 C++ 通常允许在静态/自动内存中构造类而不使用 { {1}}。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。