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

Ric*_*rin 0 c++ hidden warnings overloading clang

考虑以下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);
}
Run Code Online (Sandbox Code Playgroud)

我收到这个警告:

$ 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){}
             ^
Run Code Online (Sandbox Code Playgroud)

现在..我确实藏了,Bar::handle而且我是故意这样做的.

有没有办法避免在绕过它时抑制警告?

没有必要说g++完全没有抱怨这一点.

Hay*_*ayt 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
};
Run Code Online (Sandbox Code Playgroud)

  • @RiccardoManfrin为什么首先需要隐藏它?为什么不将函数重命名为适当的东西?"handle"是一个非常通用的名称.我无法真正告诉你这个设计中的问题在哪里没有细节.正如我所说,它是一种代码味道.有些东西闻起来有些错误,这通常表明你的设计存在问题.如果有人看到它是从BarIf派生并调用句柄并期望调用"BarIf :: handle",这可能会导致意外行为.编译器不会捕获这个,所以你遇到潜在的运行时错误. (2认同)