基础的私有虚函数由派生的私有虚函数隐藏

时间:2017-02-14 21:51:24

标签: c++ overloading overload-resolution

以下代码

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内明确命名。

3 个答案:

答案 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 CB::f(int)

在应用访问规则之前进行名称查找和解析。

C::f(float)对象中查找名称f时,C会隐藏

Article。这就是编译器警告你的内容。