我一直在阅读我能找到的所有地方,我只是不明白 GCC 给我的警告是什么,让我感到不安。我有这个代码:
class A;
class B;
class Upper
{
virtual void foo(A& a);
};
class Lower : public Upper
{
void foo(B& b);
};
GCC 给我这个错误:
$ g++ -Wall -O2 -c -o /tmp/over.o /tmp/over.cpp
/tmp/over.cpp:6:18: warning: 'virtual void Upper::foo(A&)' was hidden [-Woverloaded-virtual=]
6 | virtual void foo(A& a);
| ^~~
/tmp/over.cpp:11:10: note: by 'void Lower::foo(B&)'
11 | void foo(B& b);
| ^~~
我只是不明白。也许有人需要用小词。很明显(对我来说)这两种方法是完全明确的,如果我用
foo(a)
的实例调用 class A
我会调用虚拟方法,如果我用 foo(b)
的实例调用 class B
我会调用非虚拟方法。那么,编译器抱怨的问题是什么?
我见过很多重载方法可能不明确的问题,例如
int
与 char
之类的争论,但这里没有混淆的可能性,这让我很困惑!
问题是如果你会写例如(我想这些功能是公共的)
A a;
Lower().foo( a );
编译器会报错,因为函数
foo
void foo(B& b);
在类中声明
Lower
隐藏虚函数foo
在基类中声明Upper
.
你可以解决这个问题,例如使用声明
class Lower : public Upper
{
public:
using Upper::foo;
void foo(B& b);
};
在这种情况下,对于类
Lower
的对象,您可以调用这两个函数foo
.