"使用"没有解决隐藏虚拟功能"警告

时间:2015-10-01 16:05:44

标签: overloading c++builder using c++builder-xe7

我一直在谷歌上搜索,即使我使用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 个答案:

答案 0 :(得分:1)

您必须将重载版本声明为virtual

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

不知道C ++ Builder是否支持C ++ 11,但如果确实如此,请尝试隐藏您要隐藏的delete

virtual int __fastcall ShowModal() = delete;

而不是将其放入私人部分。

答案 1 :(得分:0)

你得到了警告,因为你想要做的事情经常是错误发生的,并且如果错误地完成它是一个严重且非常难以发现的错误。 也许你应该使用不同的名字。

答案 2 :(得分:0)

bcc32在很多方面都不太符合C ++标准。每当我发现自己在问,"为什么我认为这种技术在C ++中起作用不适用于bcc32?",我通常认为它是另一个编译器错误。

ShowShowModal期间有效的事实并不令人感兴趣。查看Vcl.Forms.hpp显示了差异:Show定义为HIDESBASE(扩展为__declspec(hidesbase)的宏)。

将HIDESBASE添加到ShowModal也应该可以正常工作。由于bcc32编译器很奇怪,你可能还需要声明一个虚拟析构函数,如果你还没有它。

virtual __Fastcall ~TShowException_Form() {}