"Using" 没有解决 "hides virtual function" 警告
"Using" is not solving the "hides virtual function" warning
我一直在谷歌搜索,但找不到可以消除警告的解决方案,即使我使用 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 参数的新的。
但它仍然抱怨 "hides virtual function":
[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()
一起使用?
您也必须将重载版本声明为 virtual
:
virtual int __fastcall ShowModal(System::SysUtils::Exception * E);
不知道 C++Builder 是否支持 C++11,但如果支持,也请尝试 delete
您要隐藏的重载:
virtual int __fastcall ShowModal() = delete;
而不是将其放入私有部分。
您收到警告是因为您尝试执行的操作经常出错,并且如果出错是一个严重且很难发现的错误。 也许您应该使用其他名称。
bcc32 在很多方面都不太符合 C++ 标准。每当我发现自己问 "Why does this technique that I think should work in C++ not work in bcc32?" 时,我通常会认为这是另一个编译器错误。
Show
有效而 ShowModal
无效这一事实很有趣。查看 Vcl.Forms.hpp 可以看出区别:Show
是用 HIDESBASE
定义的(扩展为 __declspec(hidesbase)
的宏)。
将 HIDESBASE 添加到您的 ShowModal 应该也能正常工作。由于 bcc32 编译器的怪异,您可能还必须声明一个虚拟析构函数,如果您还没有的话。
virtual __Fastcall ~TShowException_Form() {}
我一直在谷歌搜索,但找不到可以消除警告的解决方案,即使我使用 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 参数的新的。
但它仍然抱怨 "hides virtual function":
[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()
一起使用?
您也必须将重载版本声明为 virtual
:
virtual int __fastcall ShowModal(System::SysUtils::Exception * E);
不知道 C++Builder 是否支持 C++11,但如果支持,也请尝试 delete
您要隐藏的重载:
virtual int __fastcall ShowModal() = delete;
而不是将其放入私有部分。
您收到警告是因为您尝试执行的操作经常出错,并且如果出错是一个严重且很难发现的错误。 也许您应该使用其他名称。
bcc32 在很多方面都不太符合 C++ 标准。每当我发现自己问 "Why does this technique that I think should work in C++ not work in bcc32?" 时,我通常会认为这是另一个编译器错误。
Show
有效而 ShowModal
无效这一事实很有趣。查看 Vcl.Forms.hpp 可以看出区别:Show
是用 HIDESBASE
定义的(扩展为 __declspec(hidesbase)
的宏)。
将 HIDESBASE 添加到您的 ShowModal 应该也能正常工作。由于 bcc32 编译器的怪异,您可能还必须声明一个虚拟析构函数,如果您还没有的话。
virtual __Fastcall ~TShowException_Form() {}