2010-06-04 3 views
16

Почему компилятор 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; 
} 

ответ

29

В B::rofl(int) 'шкура' The A::rofl(). Для того чтобы иметь rofl перегрузки, вам следует указать B, чтобы быть using A::rofl;.

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

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

+0

+1 Быстрее, чем я рядом :) – AraK

+0

yep, но A :: rofl() не является виртуальным. То, что идея - rofl() всегда вызывает виртуальный rofl (0). –

+0

@ 0xDEAD BEEF: в этом случае вы используете _intend_, чтобы сделать это понятным для компилятора, произнеся «using A :: rofl;». – xtofl

Смежные вопросы