Classes and class hierarchies
C.138
Создавайте набор перегрузок для производного класса и его баз с помощью `using`
Причина
Без объявления using функции-члены производного класса скрывают весь унаследованный набор перегрузок.
Пример (плохой)
#include <iostream>
class B {
public:
virtual int f(int i) { std::cout << "f(int): "; return i; }
virtual double f(double d) { std::cout << "f(double): "; return d; }
virtual ~B() = default;
};
class D: public B {
public:
int f(int i) override { std::cout << "f(int): "; return i + 1; }
};
int main()
{
D d;
std::cout << d.f(2) << '\n'; // выводит "f(int): 3"
std::cout << d.f(2.3) << '\n'; // выводит "f(int): 3"
}
Пример (хороший)
class D: public B {
public:
int f(int i) override { std::cout << "f(int): "; return i + 1; }
using B::f; // открывает f(double)
};
Примечание
Эта проблема касается как виртуальных, так и невиртуальных функций-членов
В C++17 для вариативных баз введена вариативная форма объявления using:
template<class... Ts>
struct Overloader : Ts... {
using Ts::operator()...; // открывает operator() из каждой базы
};
Контроль
Диагностировать сокрытие имён