2016-10-04 2 views
9

Рассмотрим следующую иерархию структур:Скрытие перегружен виртуальная функция

struct I1 { 
    virtual void doit() = 0; 
}; 

struct I2 { 
    virtual void doit(int) = 0; 
}; 

struct I12 : I1, I2 { 
    using I1::doit; 
    using I2::doit; 
}; 

struct Derived : I12 { 
    void doit(int) override {} 
}; 

Компиляция этого (с использованием clang или g++ с -Woverloaded-virtual) дает мне предупреждение:

'Derived::doit' hides overloaded virtual function [-Woverloaded-virtual] 

Однако, если я изменю I12 к следующему, он компилирует штраф под clang, а g++ -Woverloaded-virtual все еще дает предупреждение:

struct I12 : I1, I2 { 
    using I1::doit; 
    void doit(int) override = 0; 
}; 

Где разница между using I2::doit и void doit(int) override = 0? Наивно, я бы подумал, что первое достаточно, чтобы сообщить компилятору, что я знаю, что есть две версии doit.

+0

Какой у вас компилятор? Я не могу получить предупреждение в gcc или MSVS, но я делаю это в clang. – NathanOliver

+0

Да, вы его скрываете. Тогда в чем ваш вопрос? Как устранить подробное предупреждение? – songyuanyao

+0

@NathanOliver Я использовал clang, но с помощью g ++ с предупреждениями показано другое поведение. – phimuemue

ответ

1

Жалуется, что doit скрыто в Derived. A fix:

struct Derived : I12 { 
    using I12::doit; // Bring all doit declarations from I12 into this scope. 
    void doit(int) override {} 
}; 
+0

Спасибо за ваше усмотрение, но в моем конкретном случае у меня есть 'Derived1',' Derived2', ... и, возможно, даже 'doit1',' doit2' ..., поэтому я действительно не хочу повторять все эти 'using'-declaratios везде, но, если возможно, только в одном центральном месте. – phimuemue

+0

@phimuemue При такой конструкции может быть проще отключить предупреждение. '-Wno перегруженных-virtual'. В противном случае вам придется посыпать «использование» по всему месту, потому что это то, как скрытие имен работает на C++. –

Смежные вопросы