[英]Private virtual function of base is hidden by private virtual function of derived
以下代码
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
编译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
的范围来看,由于B::f(int)
在C
是私有的,因此f
仅有一种可能的重载。
从B
的范围来看,有两个,但是两个都在B
内部被明确命名。
警告告诉您函数C::f(float)
隐藏了B::f(int)
,这是因为这样做了 。 访问说明符不会影响重载,因此B::f(int)
是私有的事实无关紧要。 即使B::f(int)
是公共的,也不会考虑将其用于重载解析,这就是“隐藏”的含义。
引用GCC手册 :
-Woverloaded-virtual
(仅C ++和Objective-C ++)在函数声明从基类隐藏虚拟函数时发出警告。 例如,在:struct A { virtual void f(); }; struct B: public A { void f(int); };
f
的A
类版本隐藏在B
,代码如下:B* b; b->f();
无法编译。
我不明白这里隐藏了什么。 从
C
的范围来看,由于B::f(int)
在C
是private
,因此f
仅有一种可能的重载。
名称访问和解析在应用访问规则之前发生。
从C
对象查找名称f
时, B::f(int)
被C::f(float)
隐藏。 那就是编译器警告您的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.