Виртуальная функция, реализованная в базовом классе, не обнаруживается компилятором

У меня ситуация, когда кажется, что компилятор не находит определение / реализацию базового класса виртуальной функции с тем же именем, что и другая функция-член.

struct One {};

struct Two {};

struct Base
{
    virtual void func( One & );
    virtual void func( Two & ) = 0;
};

struct Derived : public Base
{
    virtual void func( Two & );
};

void Base::func( One & )
{}

void Derived::func( Two & )
{}

// elsewhere
void this_fails_to_compile()
{
    One one;
    Derived d;
    d.func( one );
}

Я использую Visual C ++ 2008. Сообщение об ошибке:

ошибка C2664: 'Derived :: func': невозможно преобразовать параметр 1 из 'One' в 'Two &'

Я бы подумал, что диспетчеризация на основе типов будет работать и вызывать определенная функция базового класса. Если я добавлю Derived :: func (One & ) он компилируется и вызывается правильно, но в моей ситуации эта версия функции может быть выполнена в базовом классе, и обычно производным классам не нужно реализовывать ее самостоятельно. В настоящее время я работаю над этим, помещая в базовый класс не виртуальную функцию с другим именем, которая перенаправляет вызов функции, вызывающей проблему:

// not virtual, although I don't think that matters
void Base::work_around( One & one )
{
    func( one );
}

Это работает, но явно не идеально.

Какое наследование и / или правило сокрытия имени, что мне здесь не хватает?

17
задан Kurt Hutchinson 9 September 2010 в 15:47
поделиться