需求
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