C ++ / CLI抽象基类?

时间:2013-02-08 12:40:23

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

我正在尝试编写混合程序集,这是一个片段:

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以来已经有一段时间了,我真的不确定我在这里错过了什么。

2 个答案:

答案 0 :(得分:1)

ReadWrite覆盖使用了错误的类型(根据C#)byte[]

对于实际覆盖流上方法的覆盖,你需要使用正确的类型,这是通过修改override省略的迂回方式,直到编译器告诉我我在系统上隐藏了一个方法.IO.Stream:

因此;

typedef array<Byte>^ ByteArray;

然后;

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

答案 1 :(得分:0)

问题在于这些属性定义:

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; }
                                                      ^^^^^^^^