У меня есть базовый класс, назовите его Foo
, а производный класс назовите его Bar
. Foo
определяет виртуальную функцию doSomething
с двумя перегрузками - см. Ниже:
class Foo
{
public:
virtual void doSomething(std::string const & s)
{
printf("doSomething(std::string const &): %s\n", s.c_str());
}
virtual void doSomething(std::string const & s, int d)
{
printf("doSomething(std::string const &, int): %s %d\n", s.c_str(), d);
}
};
class Bar
: public Foo
{
public:
virtual void doSomething(std::string const & s) override
{
printf("Bar: %s\n", s.c_str());
}
};
Теперь я пытаюсь вызвать оба метода из экземпляра производного класса Bar:
int main()
{
Bar * b = new Bar();
b->doSomething("string");
b->doSomething("string", 78);
delete b;
}
и я получаю ошибку для второй перегрузки (той, которая не переопределяется в Bar
). Тот, который переопределен, в порядке, но другой (он все еще определен в базовом классе) я получаю сообщение об ошибке
error C2660: 'Bar::doSomething': function does not take 2 arguments
Если я удаляю одиночное переопределение в Bar
, так что оно просто получается из Foo
, но ничего не переопределяет, код в main
компилируется просто отлично. То же самое, если я переопределю оба.
Я уверен, что я тут тупой, но это просто не имеет смысла. Может кто-нибудь помочь пролить некоторый свет на это, и, в частности, как я могу заставить это работать без а) создания двух имен функций, или б) всегда переопределения обоих, или в) приведения к базовому классу (что для моего случая использования было бы боль)? Это будет высоко ценится.