"Использование" не означает предупреждение "скрывает виртуальную функцию"
Я гуглил все выше и ниже и не могу найти решение, которое бы убрало предупреждение, даже когда я использую 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;
но с тем же результатом. Есть идеи, как решить это предупреждение?
РЕДАКТИРОВАТЬ
Я обнаружил, что это работает очень хорошо, если я переопределить 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()
?
3 ответа
bcc32 во многих отношениях не очень совместим со стандартом C++. Всякий раз, когда я спрашиваю себя: "Почему этот метод, который, по моему мнению, должен работать в C++, не работает в bcc32?", Я обычно предполагаю, что это еще одна ошибка компилятора.
Дело в том, что Show
работает пока ShowModal
не интересно Глядя на Vcl.Forms.hpp показывает разницу: Show
определяется с HIDESBASE
(макрос, который расширяется до __declspec(hidesbase)
).
Добавление HIDESBASE в ваш ShowModal также должно работать. Вам также может потребоваться объявить виртуальный деструктор, если у вас его еще нет, из-за странности компилятора bcc32.
virtual __Fastcall ~TShowException_Form() {}
Вы получаете предупреждение, потому что то, что вы пытаетесь сделать, происходит очень часто по ошибке и является серьезной и очень трудной для обнаружения ошибкой, если это сделано по ошибке. Может быть, вы должны использовать другое имя.
Вы должны объявить перегруженную версию как virtual
тоже:
virtual int __fastcall ShowModal(System::SysUtils::Exception * E);
Не знает, поддерживает ли C++Builder C++11, но если это так, попробуйте также delete
перегрузка, которую вы хотите скрыть:
virtual int __fastcall ShowModal() = delete;
вместо того, чтобы поместить его в приватный раздел.