继承和方法重载

问题描述:

为什么C++编译器给出这个错误?为什么我可以从B访问lol(),但无法访问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; 
} 

B::rofl(int)'隐藏'A::rofl()。为了让Arofl过载,您应该声明Busing A::rofl;

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

这是C++明智之举:它警告你,你也可能需要重写A::rofl()方法B。要么你这样做,要么你明确声明你使用了A的其他重载。

+0

+1比我更快的队友:) – AraK 2010-06-04 12:24:11

+0

是的,但A :: rofl()不是虚拟的。这就是想法 - rofl()总是调用虚拟rofl(0)。 – 2010-06-04 12:26:44

+0

@ 0xDEAD BEEF:在这种情况下,你可以使用它,所以通过说'使用A :: rofl;'来清楚地告诉编译器。 – xtofl 2010-06-04 12:33:29