У меня есть базовый класс C++, который объявляет виртуальный метод с двумя разными сигнатурами.Переопределение виртуальных методов 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);
}
Работает отлично. Спасибо за вашу помощь. – RonnieBr