2010-06-04 53 views
16

Tại sao trình biên dịch C++ lại đưa ra lỗi này? Tại sao tôi có thể truy cập lol() từ B, nhưng không thể truy cập rofl() [không có tham số]. Đâu là bắt?Thừa kế thừa kế và thừa kế phương thức

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

Trả lời

29

B::rofl(int) 'ẩn' A::rofl(). Để có quá tải A 's rofl, bạn nên khai báo B thành using A::rofl;.

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

Đây là một động thái khôn ngoan của C++: nó cảnh báo bạn rằng bạn có lẽ cũng cần phải ghi đè phương pháp A::rofl() trong B. Hoặc bạn làm điều đó, hoặc bạn tuyên bố rõ ràng rằng bạn sử dụng quá tải khác của A.

+0

+1 Nhanh hơn bạn đời của tôi :) – AraK

+0

yep, nhưng A :: rofl() không phải là ảo. Thats ý tưởng - rofl() allways gọi rofl ảo (0). –

+0

@ 0xDEAD BEEF: trong trường hợp đó, bạn _intend_ sử dụng nó, vì vậy hãy làm rõ điều đó với trình biên dịch bằng cách nói 'using A :: rofl;'. – xtofl