Переопределяющие виртуальные методы C ++ с несколькими сигнатурами [дубликаты]
На этот вопрос уже есть ответ:
Почему переопределенная функция в производном классе скрывает другие перегрузки базового класса? 4 ответаУ меня есть базовый класс C ++, который объявляет виртуальный метод с двумя разными сигнатурами.
Как только я переопределю одну из сигнатур виртуального метода в производном классе, компилятор (g ++ 4.6.3 и g ++ 4.7) больше не сможет сопоставить метод со второй сигнатурой в том же производном классе.
Пример кода ниже не будет скомпилирован, если я определю SPECIALIZE_ONEARG только для 1. Чтобы заставить его скомпилироваться снова, я также должен определить PASSTHRU_TWOARG для 1. Использование метода «PASSTHRU» не идеально из-за эффективности и из-за реального иерархия классов намного глубже, и я бы предпочел не использовать провод в вызове базового класс
Это поведение специфично для g ++ или я просто пытаюсь сделать что-то, что не поддерживается в C ++?
#define SPECIALIZE_ONEARG ( 0 )
#define PASSTHRU_TWOARG ( 0 )
class base
{
public:
virtual int myMethod( char a ) { return 1; }
virtual int myMethod( char a, int b ) { return 2; }
};
class derived : public base
{
public:
#if SPECIALIZE_ONEARG
virtual int myMethod( char a ) { return 3; }
#endif // SPECIALIZE_ONEARG
#if PASSTHRU_TWOARG
virtual int myMethod( char a, int b ) { return base::myMethod( a, b ); }
#endif // PASSTHRU_TWOARG
};
int main( int argc, char* argv[])
{
derived myObj;
return myObj.myMethod( 'a' ) * 10 + myObj.myMethod( 'b', 0 );
}