2

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()呢?

4

3 回答 3

2

bcc32 在许多方面都不太符合 C++ 标准。每当我发现自己问“为什么我认为应该在 C++ 中工作的这种技术在 bcc32 中不起作用?”时,我通常认为这是另一个编译器错误。

Show有效而无效的事实ShowModal很有趣。查看 Vcl.Forms.hpp 可以看出区别:ShowHIDESBASE(扩展为 的宏__declspec(hidesbase))定义。

将 HIDESBASE 添加到您的 ShowModal 应该也可以。由于 bcc32 编译器的怪异,您可能还必须声明一个虚拟析构函数,如果您还没有的话。

virtual __Fastcall ~TShowException_Form() {}
于 2015-10-01T17:21:16.563 回答
0

您也必须声明重载版本virtual

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

不知道 C++Builder 是否支持 C++11,但如果支持,请尝试delete重载要隐藏的内容:

virtual int __fastcall ShowModal() = delete;

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

于 2015-10-01T16:16:02.367 回答
0

您收到警告是因为您尝试执行的操作经常错误地发生,并且如果错误地执行,这是一个严重且很难找到的错误。也许您应该使用不同的名称。

于 2015-10-01T16:17:03.477 回答