为什么声明虚函数的明确非虚重载是警告?

问题描述 投票:0回答:1

我一直在阅读我能找到的所有地方,我只是不明白 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
之类的争论,但这里没有混淆的可能性,这让我很困惑!

c++ class inheritance overloading name-lookup
1个回答
2
投票

问题是如果你会写例如(我想这些功能是公共的)

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
.

© www.soinside.com 2019 - 2024. All rights reserved.