【问题标题】:C++/CLI abstract base class?C++/CLI 抽象基类?
【发布时间】:2013-02-08 12:40:22
【问题描述】:

我正在尝试编写一个混合程序集。这是一个sn-p:

public ref class OpusStream
: public Stream
{
protected:
    OpusStream(void);

public:
    ~OpusStream(void);
    !OpusStream(void);
    int TestEncode(void);

    /* System::IO::Stream */
    virtual property bool CanRead { bool get(void) override; }
    virtual property bool CanSeek { bool get(void) override; }
    virtual property bool CanWrite { bool get(void) override; }
    virtual property __int64 Length { __int64 get(void) override; }
    virtual property __int64 Position {
        __int64 get(void) override;
        void set(__int64) override;
    }
    virtual void Flush(void) override;
    int Read(Byte[], int, int) override;
    long Seek(long, System::IO::SeekOrigin) override;
    void SetLength(long) override;
    void Write(Byte[], int, int) override;
};

这是编译器错误:

错误 11 无法创建抽象类或接口“OpusNet.OpusStream”的实例 C:\Users\benc\Documents\opus-1.1-alpha\OpusTests\MainWindow.xaml.cs 30 21 OpusTests

自从我完成 C++/CLI 以来已经有一段时间了。我真的不确定我在这里错过了什么。

【问题讨论】:

  • 正如错误所说,该类在MainWindow.xaml.cs 中被识别为抽象类。在您提供实现之前,您不能只创建抽象类的实例。
  • 您从抽象类Stream 继承而没有实现所有抽象方法(或者看起来如此)。您是否尝试过实现 Stream 的所有方法(假设这是 System.IO.Stream)?
  • 在“输出”窗口中查看完整的错误消息,它会告诉您忘记覆盖哪个抽象基类成员。
  • 我已经实现了所有的抽象成员。

标签: c# c++-cli managed-c++


【解决方案1】:

Read 和 Write 覆盖使用了错误的类型(根据 C#)byte[]。

要让覆盖实际覆盖流上的方法,您需要使用正确的类型,这是我通过修补 override 发现的一种迂回方式,直到编译器告诉我我在 System.IO 上隐藏了一个方法.Stream:

所以;

typedef array<Byte>^ ByteArray;

那么;

virtual __int32 Read(ByteArray, __int32, __int32) override;

【讨论】:

  • 好收获。我在 C++/CLI 中编写了我自己的 Stream 子类,我什至没有注意到我在 Byte[] 的地方输入了 array&lt;Byte&gt;^。
【解决方案2】:

问题在于这些属性定义:

virtual property bool CanRead { bool get(void) sealed new; }
virtual property bool CanSeek { bool get(void) sealed new; }

通过将其声明为new,您并没有覆盖基类上的抽象成员!相反,您在类中声明了一个新成员,与基类的抽象成员同名,但不覆盖抽象成员。

将其切换为实际覆盖成员,您会没事的。

virtual property bool CanRead { bool get(void) sealed override; }
virtual property bool CanSeek { bool get(void) sealed override; }
                                                      ^^^^^^^^

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2012-05-03
    相关资源
    最近更新 更多