Может ли класс перегружать методы, которые также существуют в публично унаследованном интерфейсе?
Кажется, это однозначно и полезно, но компиляторы (VC, Intel, GCC) все жалуются, по крайней мере, на мою конструкцию.
Ниже приведен пример с игрушкой. Унаследованная функция rebound () имеет две явные перегрузки, но это не скомпилируется. Если вы переименовываете метод rebound () в любом классе, он работает нормально, но если они имеют одно и то же имя функции-члена (даже если они перегружены различными типами аргументов!), Вы получите фатальную ошибку "слишком мало аргументов для вызова функции."
Обходной путь тривиален (я просто переименую методы), но я просто пытаюсь понять, является ли это ограничением C ++ (и почему это так).
#include
class Bound {
public:
Bound() : x0(0.0), x1(0.0) {};
Bound(double x) : x0(x), x1(x) {};
double width() const {return x1-x0;}
void rebound(const Bound *a, const Bound *b);
private:
double x0, x1;
};
void Bound::rebound(const Bound *a, const Bound *b)
{
if (a && b) {
x0=std::min(a->x0, b->x0);
x1=std::max(a->x1, b->x1);
}
}
class Node : public Bound {
public:
Node(double x) : Bound(x), left(0), right(0) {};
Node(Node *a, Node *b) : left(a), right(b) {rebound();}
void rebound() { rebound(left, right); }
private:
Node *left;
Node *right;
};
int main() {
Node A(1.0);
Node B(2.0);
Node C(&A, &B);
}