2010-06-04 14 views
16

Neden C++ derleyicisi bu hatayı veriyor? Neden B'den lol() 'a erişebilirim, fakat rofl() [parametresiz]' e erişemiyorum. Yaka nerede?Kalıtım ve yöntem aşırı yükleme

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; 
} 

cevap

29

B::rofl(int) 'gizler' A::rofl(). A'un rofl aşırı yüklenmelerine sahip olmak için,numarasını using A::rofl; olarak bildirmeniz gerekir.

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

Bu ++ C akıllıca bir harekettir: o zaman muhtemelen de B yılında A::rofl() yöntemini geçersiz gerektiğini uyarır. Ya bunu yaparsınız, ya da A'un diğer aşırı yüklerini kullandığınızı açıkça beyan edersiniz.

+0

+1 Benden daha hızlı :) – AraK

+0

evet, ancak A :: rofl() sanal değil. Bu nedenle - rofl() her zaman sanal rofl (0) çağırır. –

+0

@ 0xDEAD BEEF: Bu durumda, kullanmak için _intend_, yani A :: rofl; 'kullanarak derleyiciye bunu netleştirin. – xtofl