2013-03-21 41 views
6

tôi có mã này:Calling lớp cơ sở của

#include <iostream> 
#include <string> 

using namespace std; 

class A { 
    public: void Print(int i) {cout<<i;} 
}; 

class B : public A { 
    public: void Print(string s) {cout<<s;} 
}; 

int main() { 
    B bInstance; 
    bInstance.Print(1); 
    return 0; 
} 

này mang lại cho tôi một lỗi:

error: invalid conversion from 'int' to 'const char*' [-fpermissive] 

có nghĩa là nó đang cố gắng gọi In B mà không xem xét tình trạng quá tải do di truyền. Tuy nhiên, A của In nên được gọi bằng một thể hiện B. Thực tế, nếu tôi thay đổi cuộc gọi thành

bInstance.A::Print(1); 

thì nó biên dịch mà không có bất kỳ lỗi nào, nhưng tôi muốn tránh phải viết toán tử phạm vi lớp mỗi lần. Có cách nào để nói với trình biên dịch tôi đang cố gắng gọi quá tải của lớp cơ sở của chức năng?

+2

Độ phân giải quá tải được thực hiện trước khi tìm kiếm 'A' bởi vì nó tìm thấy thứ gì đó trong 'B'. Sử dụng câu lệnh 'using' để đưa' A' vào và cho nó tham gia vào quá trình phân giải quá tải. – chris

+0

Nếu tôi có thể gợi ý rằng tính hữu dụng của quá tải đôi khi hơi bị đánh giá cao. Hãy xem xét sử dụng các tên riêng biệt thay vào đó, chẳng hạn như 'void printInt (int i);' và 'void printString (string s); ' – bobobobo

Trả lời

11

Chức năng thành viên Print() trong lớp con của bạn ẩn chức năng thành viên Print() của lớp cha. Do đó, trình biên dịch sẽ không nhìn thấy A::Print() và sẽ cố gắng gọi B::Print(), phàn nàn rằng không thể chuyển đổi int thành chuỗi.

Để mang A::Print() vào các thiết lập tình trạng quá tải, bạn có thể giới thiệu một bản tuyên bố using:

class A { 
public: 
    void Print(int i) {cout<<i;} 
}; 

class B : public A { 
public: 
    using A::Print; 
// ^^^^^^^^^^^^^^^ 
    void Print(string s) {cout<<s;} 
}; 

Đây là một live example mã của bạn làm việc, kể những sửa đổi cần thiết.

+0

Thêm dòng đó, bây giờ cho' lỗi: void A :: Print (int) là không thể truy cập '. – Mic

+1

@Mic, Đặt nó trong phần 'public:' của 'B'. Tôi đoán bạn đã thêm nó trước dòng 'public: void Print (chuỗi s) {cout << s;}', nó sẽ làm cho nó riêng tư. – chris

+0

Tôi không nhận thấy phần 'công khai' của câu 'sử dụng A :: In', câu trả lời của bạn đã rõ ràng và chính xác, cảm ơn bạn! – Mic

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