Наследование и перегрузка метода - PullRequest
16 голосов
/ 04 июня 2010

Почему компилятор C ++ выдает эту ошибку? Почему я могу получить доступ к lol () из B, но не могу получить доступ к rofl () [без параметров]. Где подвох?

class A
{
public:
   void lol(void) {}
   void rofl(void) { return rofl(0);}
   virtual void rofl(int x) {}
};

class B : public A
{
public:
   virtual void rofl(int x) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
   a.lol();
   a.rofl(1);
   a.rofl();

   B  b;
   b.lol();
   b.rofl(1);    
   b.rofl(); //ERROR -> B::rofl function does not take 0 arguments


   return 0;
}

1 Ответ

30 голосов
/ 04 июня 2010

B::rofl(int) скрывает A::rofl(). Чтобы иметь A rofl перегрузки, вы должны объявить B как using A::rofl;.

class B : public A {
public: 
    using A::rofl;
    ...
};

Это мудрый шаг в C ++: он предупреждает вас о том, что вам, вероятно, также необходимо переопределить метод A::rofl() в B. Либо вы делаете это, либо вы явно заявляете, что используете другие перегрузки A.

...