2

VCL クラスから新しいクラスを派生させていTStreamます。

// A stream based on a temporary file, deleted when the stream is closed

class TTempFileStream : public TStream
{
...
public:
  using TStream::Seek;

   __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin)
  {
    return 0; // for simplicity!
  }

  ... 
} ;

TStreamSeek の次の 2 つのバリアントを宣言します。

virtual int __fastcall Seek(int Offset, System::Word Origin)/* overload */;
virtual __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin)/* overload */;

しかし、クラスをコンパイルすると、次の W8022 警告が表示されます:-

[BCC32 Warning]_utils.h(166): W8022 
'_fastcall TTempFileStream::Seek(const __int64,TSeekOrigin)' hides virtual function '_fastcall TStream::Seek(int,unsigned short)'

確かに Using 宣言はそれを修正する必要がありますか?

この質問を軌道に戻すために、私は TStream::seek の 2 つのバージョンが相互に関連する方法を認識しており、派生クラスによって公開された継承された Seek(int,int) メソッドを取得しようとしています。なぜ私のusing宣言はそれをしていないのですか?

4

2 に答える 2

4

ロディ、あなたのコードは非常に正しいです。

TStream::Seek を使用して追加すると、コードは期待どおり (テスト済み) に動作します。そうしないと、警告が示すように、基本クラスのメソッドが非表示になります。(C++ 言語のこの部分、レミーは初めてあなたに反対しなければなりません)。

この警告は誤検出であり、少なくともバージョン 2006 から XE4 まで存在する C++ Builderの非常に古い、まだ修正されていないバグです。

于 2013-09-05T11:56:56.927 に答える
2

usingこのステートメントはまったく必要ないので、削除してください。64 ビットSeek()メソッドをオーバーライドしています。それはあなたがする必要があるすべてです。32 ビットSeek()メソッドは のパブリック メソッドであり、派生クラスで継承をTStream使用しているため、無料で取得できます。32 ビットメソッドpublicを取得または使用するために何かを宣言する必要はありません。Seek()オーバーライドしない限り、Seek()呼び出された場合、オーバーライドされた 64 ビットが内部的に呼び出されます。

class TTempFileStream : public TStream
{
...
public:
    ...
    virtual __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin)
    {
        return 0; // for simplicity!
    }
    ... 
};

参考までに、ストリームが閉じられたときに一時ファイルを削除するだけでよい場合は、派生クラスはまったく必要ありません。THandleStream代わりにRTL をそのまま使用して、フラグを に指定するHANDLEWin32 APICreateFile()関数から を渡すことができます。FILE_FLAG_DELETE_ON_CLOSECreateFile()

于 2012-12-18T19:12:17.803 に答える