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!
  }

  ... 
} ;

TStream声明了 Seek 的以下两种变体:-

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 相互关联的方式,我只是想获得派生类公开的继承 Seek(int,int) 方法。为什么我的using声明不这样做?

4

2 回答 2

4

罗迪,你的代码非常正确。

使用 TStream::Seek 添加时,代码按预期工作(经过测试);否则如警告所述,将隐藏基类方法。(这部分C++语言,Remy第一次和你不服)。

该警告是误报,C++ Builder 中的一个非常古老且尚未纠正的BUG,至少从 2006 版到 XE4 存在。

于 2013-09-05T11:56:56.927 回答
2

您根本不需要该using语句,因此请摆脱它。您正在覆盖 64 位Seek()方法。这就是你需要做的。您可以免费获得 32 位Seek()方法,因为它是一个公共方法,并且您在派生类上TStream使用继承。public您无需声明任何内容即可获取或使用 32 位Seek()方法。只要您不覆盖它,它就会在内部调用您的 64 位覆盖Seek()(如果调用)。

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

仅供参考,如果您只需要在流关闭时删除临时文件,则根本不需要派生类。THandleStream您可以按原样使用 RTL ,将其HANDLE从 Win32 APICreateFile()函数传递给您,在该函数中将FILE_FLAG_DELETE_ON_CLOSE标志指定为CreateFile().

于 2012-12-18T19:12:17.803 回答