繁体   English   中英

base的私有虚拟功能被derived的私有虚拟功能隐藏

[英]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); }; 

fA类版本隐藏在B ,代码如下:

 B* b; b->f(); 

无法编译。

我不明白这里隐藏了什么。 C的范围来看,由于B::f(int)Cprivate ,因此f仅有一种可能的重载。

名称访问和解析在应用访问规则之前发生。

C对象查找名称f时, B::f(int)C::f(float)隐藏。 那就是编译器警告您的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM