以下代码
class A
{
public:
void g(int x)
{
f(x);
}
protected:
virtual void f(int) = 0;
};
class B: public A
{
protected:
virtual void f(float) = 0;
private:
void f(int x) override final
{
f(float(x));
}
};
class C: public B
{
private:
void f(float) override final {}
};
int
main()
{
C c;
c.g(1);
return 0;
}
用g++ -Woverloaded-virtual
编译的产生了警告:
x.cc:19:7: warning: ‘virtual void B::f(int)’ was hidden [-Woverloaded-virtual]
void f(int x) override final
^
x.cc:28:7: warning: by ‘virtual void C::f(float)’ [-Woverloaded-virtual]
void f(float) override final {}
^
我不明白这里隐藏着什么。在C
的范围内,f
只有一个可能的重载,因为B::f(int)
中的C
是私有的。
在B
的范围内,有两个,但都在B
内明确命名。
答案 0 :(得分:4)
警告告诉您,C::f(float)
函数隐藏B::f(int)
,因为it does隐藏了B::f(int)
。访问说明符不会影响重载,因此B::f(int)
是私有的这一事实并不重要。即使from django.utils import timezone
from dateutil.relativedelta import relativedelta
import datetime
import pytz
end_date = timezone.localtime(timezone.now()).replace(tzinfo=pytz.timezone('America/Guatemala'))
start_date = end_date + relativedelta(hours=-3)
camera_logs = CameraLog.objects.filter(camera_id=camera_id, created_at__range=(start_date, end_date))
是公开的,它也不会被考虑用于重载解析,而且"隐藏"是指。
答案 1 :(得分:1)
引用GCC manual:
-Woverloaded-virtual
(仅限C ++和Objective-C ++) 当函数声明隐藏基类中的虚函数时发出警告。例如,在:struct A { virtual void f(); }; struct B: public A { void f(int); };
A
的{{1}}类版本隐藏在f
中,代码如下:B
无法编译。
答案 2 :(得分:1)
我不明白这里隐藏着什么。在
C
的范围内f
只有一个可能的重载B::f(int)
private
C
内B::f(int)
。
在应用访问规则之前进行名称查找和解析。
从C::f(float)
对象中查找名称f
时,C
会隐藏 Article
。这就是编译器警告你的内容。