Переопределить виртуальные функции с перегрузкой - PullRequest
0 голосов
/ 06 мая 2018

У меня есть базовый класс, назовите его 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 компилируется просто отлично. То же самое, если я переопределю оба.

Я уверен, что я тут тупой, но это просто не имеет смысла. Может кто-нибудь помочь пролить некоторый свет на это, и, в частности, как я могу заставить это работать без а) создания двух имен функций, или б) всегда переопределения обоих, или в) приведения к базовому классу (что для моего случая использования было бы боль)? Это будет высоко ценится.

...