Рассмотрим следующую иерархию структур:
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
,
Жалуется что doit
спрятан в Derived
, Исправление:
struct Derived : I12 {
using I12::doit; // Bring all doit declarations from I12 into this scope.
void doit(int) override {}
};
Других решений пока нет …