Я извлекаю новый класс из 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
объявляет следующие два варианта поиска: —
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
декларация делает это?
Родди, твой код очень верный.
Код работает как положено (проверено) при добавлении с использованием TStream :: Seek; в противном случае, как указано в предупреждении, будет скрыт метод базового класса. (эта часть языка C ++, Реми должен впервые с вами не согласиться).
Это ложное срабатывание, очень старое и еще не исправленное BUG в C ++ Builder присутствует как минимум с версии 2006 до XE4.
Вам не нужно 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
вместо этого, передавая это HANDLE
из Win32 API CreateFile()
функция, где вы указываете FILE_FLAG_DELETE_ON_CLOSE
флаг для CreateFile()
,