2015-10-01 3 views
0

Я работаю с поисковой системой по высоким и низким параметрам и не могу найти решение, которое удалит предупреждение, даже если я использую директиву using.«Использование» не разрешает предупреждение «скрывает виртуальную функцию»

class TShowException_Form : public TForm { 

    __published: // IDE-managed Components 
     TButton *Send_Button; 
     TButton *Cancel_Button; 
     TLabel *Message_Label; 

    private: // User declarations 
     using TCustomForm::ShowModal; 
     //using TForm::ShowModal; 

    public:  // User declarations 
      __fastcall TShowException_Form(TComponent* Owner); 
     int __fastcall ShowModal(System::Sysutils::Exception *E); 
}; 

Я хочу, чтобы скрыть оригинальный virtual int __fastcall ShowModal(void) и выставить новый принимая параметр Exception.

Но это еще жалобы на «скрывает виртуальную функцию»:

[bcc32 Warning] TShowExceptionForm.h(32): '_fastcall TShowException_Form::ShowModal(Exception *)' hides virtual function '_fastcall TCustomForm::ShowModal()' 

Я также попытался using TForm::ShowModal;, но с тем же результатом. Любые идеи о том, как решить это предупреждение?


EDIT
я узнал, что он работает отлично, если я переопределить метод show() вместо:

class TShowException_Form : public TForm { 

    __published: // IDE-managed Components 
     TButton *Send_Button; 
     TButton *Cancel_Button; 
     TLabel *Message_Label; 

    private: // User declarations 
     using TForm::ShowModal; 
     using TForm::Show; 

    public:  // User declarations 
      __fastcall TShowException_Form(TComponent* Owner); 
     int __fastcall Show(System::Sysutils::Exception *E); 
}; 

Так почему он не работает с ShowModal()?

ответ

0

bcc32, во многих отношениях, не очень соответствует стандарту C++. Всякий раз, когда я спрашиваю: «Почему эта техника, которая, как мне кажется, должна работать на C++, не работает в bcc32?», Я обычно предполагаю, что это еще одна ошибка компилятора.

Дело в том, что Show работает пока ShowModal не представляет интерес. Глядя на Vcl.Forms.hpp показывает разницу: Show определяется с помощью HIDESBASE (макрос, который расширяется до __declspec(hidesbase)).

Добавление HIDESBASE к вашему ShowModal также должно работать. Вам также может потребоваться объявить виртуальный деструктор, если у вас его еще нет, из-за странности компилятора bcc32.

virtual __Fastcall ~TShowException_Form() {} 
+0

HIDEBASE сделал трюк. Да, я также привык к Quirks C++ Builder, но для меня это было новое ... –

+0

Да, 'HIDESBASE' - правильный ответ, когда вы хотите ** скрыть и перегрузить ** базовый класс виртуальный метод, а не ** переопределить ** его. –

0

Вы должны объявить перегруженную версию, как virtual тоже:

virtual int __fastcall ShowModal(System::SysUtils::Exception * E); 

Не знаю, C++ Builder поддерживает C++ 11, но если это произойдет, попробуйте также delete перегрузки, которые вы хотите скрыть:

virtual int __fastcall ShowModal() = delete; 

вместо того, чтобы поместить его в частную секцию.

+0

виртуальный не помогает, но я обнаружил, что если я объявляю 'ShowModal' тело в определении класса, он работает, но не если я поместить его в файле .cpp. Bcc32 в XE7 не имеет полного C++ 11, поэтому удаление не работает. –

+0

64-разрядный компилятор C++ Builder для Windows (представленный в XE2) поддерживает C++ 11. Недавно C++ Builder приобрел [новый 32-разрядный компилятор C++ 11 для Windows] (http://docwiki.embarcadero.com/RADStudio/Seattle/en/What%27s_New#New_Clang-enhanced_C.2B.2B_Compiler_for_32- bit_Windows) в C++ Builder 10 Seattle (32-разрядный компилятор OSX не поддерживает C++ 11, AFAIK). –

0

Вы получаете предупреждение, потому что то, что вы пытаетесь сделать, происходит очень часто по ошибке и является серьезным и очень трудным для поиска ошибок, если это делается по ошибке. Возможно, вы должны использовать другое имя.

+0

...и именно поэтому я использую оператор 'using TForm :: ShowModal;', чтобы сообщить компилятору, что это то, что я хочу. –