"Using declaration" 在 RADStudio 2010 中不起作用

"Using declaration" not working in RADStudio 2010

本文关键字:不起作用 2010 Using declaration RADStudio      更新时间:2023-10-16

我正在从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)'

肯定的使用声明应该解决吗?

要将这个问题拖回正轨,我知道Tstream的两个版本::寻求相互关联的方式,而我只是想获得派生的seek(int,int)方法。。为什么我的using声明不这样做?

roddy,您的代码非常正确。

使用tstream :: seek添加时,代码按预期工作(测试);否则,如警告所述,将隐藏基类方法。(C 语言的这一部分,雷米必须第一次与您不同意)。

警告是一个假阳性,一个非常旧的且尚未在C 构建器中尚未纠正的错误,至少从2006年版本到XE4。

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

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

fyi,如果您只需要在关闭流时删除临时文件,则根本不需要派生的类。您可以使用RTL的THandleStream AS-IS,将其从Win32 API CreateFile()函数传递给HANDLE,其中您将FILE_FLAG_DELETE_ON_CLOSE标志指定到CreateFile()