考虑以下C ++示例main.cpp
文件:
class FooIf
{
public:
virtual int handle(char *req, char *res) = 0;
};
class BarIf
{
public:
virtual void handle(char *msg) = 0;
};
class Bar : private BarIf
{
private:
void handle(char * msg){}
};
class Zoo : public FooIf, public Bar
{
public:
using FooIf::handle;
public:
int handle(char *req, char *res){ return (0); }
};
int main(){
Zoo zoo;
return (0);
}
我收到此警告:
$ clang++ -ggdb -c main.cpp -Wall
main.cpp:23:6: warning: 'Zoo::handle' hides overloaded virtual function [-Woverloaded-virtual]
int handle(char *req, char *res){ return (0); }
^
main.cpp:17:7: note: hidden overloaded virtual function 'Bar::handle' declared here: different number of parameters (1 vs 2)
void handle(char * msg){}
^
现在......我确实隐藏了Bar::handle
,我正在 故意 。
有没有办法避免在获取此信息时抑制警告?
没有必要说g++
对此没有抱怨。
答案 0 :(得分:5)
您应该考虑不同的设计。如果您真的需要这个,这似乎是代码气味/设计问题。
如果(无论出于何种原因)您真的想这样做,您可以在特定地点关闭警告。有关信息,请参阅此处http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas
在你的情况下,这将是这样的
class Zoo : public FooIf, public Bar
{
public:
using FooIf::handle;
public:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Woverloaded-virtual"
int handle(char *req, char *res){ return (0); }
#pragma clang diagnostic pop
};
答案 1 :(得分:1)
警告可识别可能存在的问题。
可能是这里的关键词。如果忽略警告,您的代码可以完全正常运行。但是,在数百万开发人员的经验中,超过数万亿行的代码导致编译器说“这是一个坏主意"。
修复它包括禁止警告,或简单地重命名方法。
这是一个潜在的警告,因为该类中handle
的含义在很大程度上取决于你如何调用它。此外,人们有时会意外地失败通过给它稍微不同的签名来重载函数。
在两者之间,将它标记为警告是值得的。
解决问题的最佳途径取决于您问题中未显示的详细信息。