2012-05-29 2 views
2

У меня есть базовый класс 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); 
} 

ответ

6

ваше определение скрывается определение базового класса. Чтобы это определение было видимым в вашей производной области, вам нужно using 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 
}; 
+0

Работает отлично. Спасибо за вашу помощь. – RonnieBr

2

В производном классе добавьте

using base::myMethod;