需求

C++ 中警告:

tcp_socket.h:15:10: warning: 'TcpSocket::readData' hides overloaded virtual function
qabstractsocket.h:215:12: note: hidden overloaded virtual function 'QAbstractSocket::readData' declared here: different number of parameters (2 vs 0)

解决

这个问题的原因很简单,就是子类里面重载了父类的虚函数,被重载的虚函数在子类中将会被隐藏。

何为隐藏呢,应该是不能使用子类实例直接调用父类被隐藏的函数,调用时必须指定父类命名空间,往深了说也就是编译器如果在子类中发现了要使用的函数的名字,注意,是名字不包含函数签名,只要名字匹配上,就不会再去父类中去寻找这个名字的函数,即便子类中的函数参数不匹配,也不会再去父类中寻找。

原因

注意是防止书写错误,比如下面这个,如果在子类定义的时候,想的是重写 void foo(BookA *), 结果把 A 写成 B 了,那么这个警告就能提醒了。

class BookA; //改动处
class BookB; //改动处

class A {
public:
    virtual void foo(BookA *) { //改动处
      cout << "foo of A" << endl;
    }
};

class B : public A{
public:
    void foo(BookB *) { //改动处
      cout << "foo of B" << endl;
    }
};

int main(void)
{
    A *b = new B(); //改动处
    b->foo(new BookB());
    return 0;
}

解决警告

如果确实是需要重载,又不希望有这个警告碍眼,可以使用 private 加上 using 来解决。 private 是为了防止子类的对象来使用父类的这个虚函数。

class B : public A{
public:
    void foo(BookB *) {
      cout << "foo of B" << endl;
    }
private:
    using A::foo;
};

参考

hides overloaded virtual function

c++ overloaded virtual function warning by clang?

当心虚函数重载(overloaded-virtual)