故意隐藏重载功能警告避免

时间:2016-09-29 13:47:36

标签: c++ clang warnings overloading hidden

考虑以下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++对此没有抱怨。

2 个答案:

答案 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的含义在很大程度上取决于你如何调用它。此外,人们有时会意外地失败通过给它稍微不同的签名来重载函数。

在两者之间,将它标记为警告是值得的。

解决问题的最佳途径取决于您问题中未显示的详细信息。