【发布时间】:2017-02-07 21:18:37
【问题描述】:
考虑以下 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++ 一点也不抱怨。
【问题讨论】:
-
你不应该故意这样做。您正在破坏多态性的意图。如果您不想要多态性,请使用封装。
-
我不明白你的意思,你能举个例子吗?我在这里找到的唯一答案是(stackoverflow.com/questions/18515183/…),而且对我来说绝对更像是一个借口,而不是真正的动机。我很乐意避免删除警告,但不想仅仅因为 clang 想防止我输入错误就搞砸代码..
-
句柄的定义放错了地方。多态基类要求所有派生类实现基类中的所有方法。所以从 BarIf 中删除 handle(),因为你不需要它——或者从其他东西派生 Zoo
-
TL;DR:警告应该是一个错误。类的设计被破坏了。
-
> 不用说 g++ 对此一点也不抱怨。嗯?
标签: c++ clang warnings overloading hidden