"使用声明"不在RADStudio 2010中工作

时间:2012-12-18 16:30:14

标签: c++ c++builder c++builder-2010 using-declaration

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

2 个答案:

答案 0 :(得分:3)

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

使用TStream :: Seek添加时,代码按预期(测试)工作;否则作为警告状态,将隐藏基类方法。 (这部分C ++语言,雷米第一次不同意你)。

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

答案 1 :(得分: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!
    }
    ... 
};

仅供参考,如果您只需要在关闭流时删除临时文件,则根本不需要派生类。您可以使用RTL的THandleStream,而不是从Win32 API HANDLE函数中传递CreateFile(),您可以在其中指定FILE_FLAG_DELETE_ON_CLOSE标记为CreateFile()