& quot; Использование декларации & quot; не работает в RADStudio 2010

Я извлекаю новый класс из 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 декларация делает это?

2

Решение

Родди, твой код очень верный.

Код работает как положено (проверено) при добавлении с использованием TStream :: Seek; в противном случае, как указано в предупреждении, будет скрыт метод базового класса. (эта часть языка C ++, Реми должен впервые с вами не согласиться).

Это ложное срабатывание, очень старое и еще не исправленное BUG в C ++ Builder присутствует как минимум с версии 2006 до XE4.

3

Другие решения

Вам не нужно 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(),

2

По вопросам рекламы [email protected]