"Использование" не означает предупреждение "скрывает виртуальную функцию"

Я гуглил все выше и ниже и не могу найти решение, которое бы убрало предупреждение, даже когда я использую 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;

вместо того, чтобы поместить его в приватный раздел.

Другие вопросы по тегам