2010-03-13 55 views
7

khi truy cập foo() của "cơ sở" bằng đối tượng của lớp dẫn xuất.truy cập phương thức của lớp cơ sở với đối tượng của lớp dẫn xuất có phương thức cùng tên

#include <iostream> 

class base 
{ 
     public: 
     void foo() 
    { 
     std::cout<<"\nHello from foo\n"; 
    } 
}; 

class derived : public base 
{ 
    public: 
    void foo(int k) 
    { 
     std::cout<<"\nHello from foo with value = "<<k<<"\n"; 
    } 
}; 
int main() 
{ 
     derived d; 
     d.foo();//error:no matching for derived::foo() 
     d.foo(10); 

} 

cách truy cập phương thức lớp cơ sở có cùng tên trong lớp dẫn xuất. lỗi được tạo đã được hiển thị. tôi xin lỗi nếu tôi không rõ ràng nhưng tôi cảm thấy tôi đã làm cho bản thân mình rõ ràng như nước. cảm ơn trước.

Trả lời

10

Bạn có thể thêm using base::foo đến lớp được thừa kế của bạn:

class derived : public base 
{ 
public: 
    using base::foo; 
    void foo(int k) 
    { 
     std::cout<<"\nHello from foo with value = "<<k<<"\n"; 
    } 
}; 

Edit: Câu trả lời cho this question giải thích lý do tại sao base::foo() của bạn không thể sử dụng trực tiếp từ derived mà không có tuyên bố using.

+0

nhưng tại sao lớp cơ sở foo() không thể truy cập trong lớp dẫn xuất trong khi tôi đã thừa kế lớp cơ sở đó ... –

+2

@ashish: Có thể truy cập (có nghĩa là các thông số truy cập của công khai/được bảo vệ/riêng tư), nhưng nó là * ẩn *. Đọc câu hỏi mà Josh đã liên kết: http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-the –

+0

oh whew, I sắp tạo ra các trình bao bọc để ủy nhiệm cho các quá tải cơ sở bị ẩn chỉ để lộ chúng từ đối tượng dẫn xuất, kiểu như 'void foo() {base :: foo()}', và sau đó đã tìm ra cách tốt hơn để làm điều này, và may mắn thay, có. Ngoài ra còn có các tùy chọn để làm 'd.base :: foo()', nhưng từ một quan điểm phía khách hàng mà dường như loại gây phiền nhiễu. – solstice333

2

Add sau tuyên bố lớp được thừa kế của bạn:

using Base::foo ; 

này sẽ phục vụ mục đích này.

Khi bạn có hàm trong lớp dẫn xuất có cùng tên với một trong các hàm trong lớp cơ sở, tất cả các hàm của lớp cơ sở đều bị ẩn và bạn phải đưa chúng vào phạm vi của lớp dẫn xuất như đã đề cập.

0

chúng ta có thể gọi phương thức lớp cơ sở bằng cách sử dụng đối tượng lớp dẫn xuất. theo mã bên dưới.

#include<iostream.h> 
class base 
{ 
public: 
void fun() 
{ 
    cout<<"base class\n"; 
} 
}; 
class der : public base 
{ 
public: 
void fun() 
{ 
cout<<"derived class\n"; 
} 
}; 
int main() 
{ 

der d1; 


d1.base::fun(); 


return 0; 
} 

Đầu ra sẽ là lớp cơ sở.

Các vấn đề liên quan