2011-01-04 39 views
9

Có điều gì đó trong tiêu chuẩn C++ ngăn cản tôi quá tải chức năng của một siêu lớp không?Quá tải chức năng của một siêu lớp

Bắt đầu với cặp này các lớp:

class A {   // super class 
    int x; 

public: 
    void foo (int y) {x = y;} // original definition 
}; 

class B : public A { // derived class 
    int x2; 

public: 
    void foo (int y, int z) {x2 = y + z;} // overloaded 
}; 

tôi có thể gọi B::foo() dễ dàng:

B b; 
    b.foo (1, 2); // [1] 

Nhưng nếu tôi cố gắng gọi A::foo() ...

B b; 
    b.foo (12); // [2] 

.. Tôi gặp lỗi biên dịch:

test.cpp: In function 'void bar()': 
test.cpp:18: error: no matching function for call to 'B::foo(int)' 
test.cpp:12: note: candidates are: void B::foo(int, int) 

Chỉ cần chắc chắn rằng tôi đã không thiếu cái gì, tôi đã thay đổi tên của chức năng B 's để không có tình trạng quá tải:

class B : public A { 
    int x2; 

public: 
    void stuff (int y, int z) {x2 = y + z;} // unique name 
}; 

Và bây giờ tôi có thể gọi A::foo() sử dụng ví dụ thứ hai .

Đây có phải là tiêu chuẩn này không? Tôi đang sử dụng g ++.

Trả lời

17

Bạn cần phải sử dụng một tuyên bố sử dụng trong định nghĩa của lớp B:

class B : public A { 
public: 
    using A::foo;   // allow A::foo to be found 
    void foo(int, int); 
    // etc. 
}; 

Nếu không có khai báo sử dụng, trình biên dịch thấy B::foo trong tra cứu tên và có hiệu quả không tìm kiếm các lớp cơ sở cho các đơn vị khác với cùng tên, do đó, không tìm thấy A::foo.

+1

để "bỏ ẩn" chức năng thành viên ban đầu. –

+6

+1 - lưu ý rằng điều này được đề cập (chi tiết hơn) trong Mục C++ hiệu quả của Scott Meyers 33: Tránh che giấu các tên được thừa kế. –

0

Bạn không ghi đè A::foo(int) việc triển khai, thay vào đó bạn đang bí danh A::foo và thay đổi chữ ký thành (int, int) thay vì (int). Như James McNellis đã đề cập đến tuyên bố using A::foo; làm cho chức năng từ A khả dụng.

+0

OP không nói "ghi đè", anh nói quá tải và quá tải là những gì anh ta đang làm. Ghi đè áp dụng cho các chức năng ảo. –

+0

Những gì anh ta đang làm là cố gắng làm là quá tải. Những gì ông đã làm thay vào đó là một cái gì đó giống như trọng, nhưng với tiền thưởng thêm của răng cưa phương pháp ban đầu. Theo ghi nhận của James McNellis, báo cáo sử dụng giải quyết vấn đề, cho phép quá tải. –

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