Перегрузка функций вполне допустима в C ++, если параметры могут создавать уникальное разрешение. В приведенном выше случае первого параметра всегда будет достаточно для однозначного разрешения одной из функций.
В контексте класса, если функции-члены определены в одном классе, он работает так же, как и для свободных функций.
Один сценарий, который ловит много новичков C ++, с наследованием:
class Foo {
public:
void s(int d, double t);
};
class Bar {
public:
void s(string d, UNIT e);
};
// ...
Bar b;
b.s("hello", 42); // Fine
b.s(3, 4.5); // FAIL
Второй вызов tp b.s
не будет работать, потому что C ++ ищет первую область видимости, которая содержит символ. В этом случае он находит Bar::s
, и даже если Bar::s(string, UNIT)
не соответствует, C ++ не пойдет и не попробует базовый класс. Как только область с символом найдена, поиск тут же прекращается, независимо от того, найдена ли в этой точке соответствующая функция.
Вы можете обойти это поведение, явно введя символ базового класса в производный класс:
class Bar {
public:
using Foo::s;
void s(string d, UNIT e);
};
РЕДАКТИРОВАТЬ: В ответ на редактирование ОП 2 ...
Проблема, которую вы видите, не имеет ничего общего с перегрузкой. Вы просто не переопределяете чисто виртуальные функции-члены в производном классе GUIButtons
. Переопределение функции базового класса с помощью соответствующей функции производного класса отличается от перегрузки.