hides overloaded virtual function 警告

在使用clang编译mysql-connector-cpp报告了一条警告hides overloaded virtual function,(在开启所有警告以及额外警告的前提下)。

在StackOverflow上可以看到一条讨论的链接stackOverflow

这条警告复现的一个简单的示例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include  <iostream>

class Base
{
public:
    virtual int Add(int x)
    {
        return x+1;
    }
};

class Drived:public Base
{
public:
    virtual int Add(int x,int y)
    {
        return x+y;
    }
};

int main(int argc,char* argv[])
{
    std::cout << argc << "\t"<<  argv[0] << std::endl;
    return 0;
}

使用g++ 7.3.0编译,不会报警告失败。

g++ -Wall -Wextra -Werror Test3.cpp

使用clang++ 6.0.0报警告

clang++ -Wall -Wextra -Werror ./Test3.cpp

这个警告的意思主要是防止不小心用重载覆盖了重写。本意是想重写,结果重载了。 比如下面这样的情况:

1
2
3
4
5
6
7
8
9
struct chart; // let's pretend this exists
struct Base
{
    virtual void* get(char* e);
};

struct Derived: public Base {
    virtual void* get(chart* e); // typo, we wanted to override the same function
};

在Drived的类中加入 using Base::Add;可以去除这条警告。