Рассмотрим следующую иерархию структур:Скрытие перегружен виртуальная функция
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
.
Какой у вас компилятор? Я не могу получить предупреждение в gcc или MSVS, но я делаю это в clang. – NathanOliver
Да, вы его скрываете. Тогда в чем ваш вопрос? Как устранить подробное предупреждение? – songyuanyao
@NathanOliver Я использовал clang, но с помощью g ++ с предупреждениями показано другое поведение. – phimuemue