У меня есть ситуация, когда кажется, что компилятор не находит определение / реализацию базового класса виртуальной функции с тем же именем, что и у другой функции-члена.
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 );
}
Это работает, но явно не идеально.
Какое правило наследования и / или сокрытия имен мне здесь не хватает?