基的私有虚函数由派生的私有虚函数隐藏
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
产生上述警告:
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
内明确命名。
警告告诉你函数C::f(float)
隐藏B::f(int)
,那是因为它确实如此。访问说明符不会影响重载,因此B::f(int)
是私有的这一事实并不重要。即使B::f(int)
是公开的,也不会考虑过载解决,这就是"隐藏"所指的。
引用GCC手册:
-Woverloaded-virtual
(仅限C++和目标C++) 当函数声明隐藏基类中的虚拟函数时发出警告。例如,在:struct A { virtual void f(); }; struct B: public A { void f(int); };
f
的A
类版本隐藏在B
中,代码如下:B* b; b->f();
编译失败。
我不明白这里隐藏了什么。从
C
范围内,只有一种可能的过载需要f
,因为B::f(int)
在C
内private
。
在应用访问规则之前进行名称查找和解析。
从C
对象中查找名称f
时,B::f(int)
被C::f(float)
隐藏。这就是编译器警告您的内容。
相关文章:
- 参数包构造函数在类模板中隐藏用户定义的转换
- 名称隐藏对静态函数继承的实例使用
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 函数隐藏和重载之间的区别
- c++ 内联友元函数是否会导致命名空间之间的名称隐藏?
- 使用函数参数隐藏成员函数
- 函数的隐藏/锚定参数?
- 调用虚函数的逻辑不清楚(或者是方法隐藏?
- 隐藏私有过载的虚拟函数?
- static_assert:派生"must"中的某个函数隐藏了Base的类函数
- 在继承的类构造函数中使用隐藏成员
- C 如何使用隐藏的默认构造函数初始化成员
- 函数隐藏和使用C 中的函数
- 基的私有虚函数由派生的私有虚函数隐藏
- 为什么基类函数没有被同名的派生类函数隐藏
- C++朋友函数被类函数隐藏
- 为什么继承的函数隐藏在这个代码的基类中
- 基类模板成员函数隐藏在派生类中,尽管参数列表不同
- 为什么在使用初始值设定项列表时,非显式构造函数被显式构造函数隐藏
- 为什么派生类重载函数隐藏基类函数