【问题标题】:How to resolve "Delphi style classes have to be derived from Delphi style classes"?如何解决“Delphi 样式类必须从 Delphi 样式类派生”?
【发布时间】:2021-06-15 20:28:11
【问题描述】:

如果我有一个类定义为:

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

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

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

我得到了错误

[bcc32c 错误] TFMainWindow.h(36): Delphi 风格类必须从 Delphi 风格类派生

我该如何解决这个问题?

【问题讨论】:

    标签: c++ delphi c++builder


    【解决方案1】:

    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++ 类派生自 TObjectMUST be constructed in dynamic memory with new 的原因,尽管 C++ 通常允许在不使用 new 的情况下在静态/自动内存中构造类。

    【讨论】:

    • 啊!那非常容易!谢谢!我从未使用过 Delphi(我也不打算使用),但我已经使用 Java 和 C# 多年,所以我熟悉继承原则,在这里。 :)
    猜你喜欢
    • 2012-04-17
    • 2023-03-29
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2015-11-10
    • 2012-08-25
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多