Вопрос по c++ – Переопределение виртуальных методов C ++ с несколькими сигнатурами [дубликат]

2

This question already has an answer here:

Why does an overridden function in the derived class hide other overloads of the base class? 4 answers

У меня есть базовый класс C ++, который объявляет виртуальный метод с двумя разными сигнатурами.

Как только я переопределил одну из сигнатур виртуального метода в производном классе, компилятор (g ++ 4.6.3 и g ++ 4.7) больше не сможет сопоставить метод со второй сигнатурой в том же производном классе.

Приведенный ниже пример кода не будет компилироваться, если я определю SPECIALIZE_ONEARG только для 1. Чтобы заставить его скомпилироваться снова, я также должен определить PASSTHRU_TWOARG для 1. Использование & quot; PASSTHRU & quot; Метод не идеален из-за эффективности и из-за того, что реальная иерархия классов намного глубже, и я бы предпочел не жестко связывать вызовы базового класса.

Это поведение специфично для 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 );
}

Ваш Ответ

2   ответа
7

Error: User Rate Limit ExceededhidingError: User Rate Limit Exceededusing base::myMethod.

class derived : public base
{
public:
  using base::myMethod; // <--- here

#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
};
Error: User Rate Limit Exceeded RonnieBr
2

Error: User Rate Limit Exceeded

using base::myMethod;

Похожие вопросы