Đó là cách ngôn ngữ được sử dụng để hoạt động. Trước khi sử dụng từ khóa, nếu bạn gạt một chức năng quá tải, bạn phải quá tải chúng tất cả:
class bar : public foo
{
public:
bar(void);
~bar(void);
a(int);
a(double d) { foo::a(d); } // add this
}
này khó chịu người đủ rằng ủy ban ngôn ngữ thêm sử dụng tính năng, nhưng một số thói quen cũ chết cứng ; và những người quen & dao găm; có một lý lẽ tốt.
Như James Hopkins chỉ ra, bằng cách thêm sử dụng, lập trình viên thể hiện ý định rằng lớp dẫn xuất sẽ không thêm bất kỳ phần ghi đè nào trong tương lai của foo :: a() vào danh sách các chữ ký chấp nhận được.
Dưới đây là một ví dụ về những gì ông mô tả: "Xuất phát :: đúp"
#include <iostream>
class Base {
public:
virtual void f(double){ std::cout << "Base::Double!" << std::endl; }
// virtual void f(int) { std::cout << "Base::Int!" << std::endl; } // (1)
virtual ~Base() {}
};
class Derived : public Base {
public:
// using Base::f; // (2)
void f(double) { std::cout << "Derived::Double!" << std::endl; }
};
int main(int, char **) {
Derived d;
d.f(21);
return 0;
}
Kết quả sẽ được bởi vì trình biên dịch sẽ thúc đẩy đối số nguyên cho một đôi. g ++ 4.0.1 -Wall sẽ không cảnh báo rằng chương trình khuyến mãi này đã xảy ra.
Bỏ ghi chú (1) để mô phỏng thay đổi trong tương lai thành Cơ sở thêm phương thức Base :: f (int). Mã biên dịch, một lần nữa mà không cần cảnh báo ngay cả với -Wall và "Derived :: Double!" vẫn là đầu ra.
Bây giờ bỏ ghi chú (2) để mô phỏng quyết định của lập trình có nguồn gốc để bao gồm tất cả chữ ký cơ sở :: f. Mã biên dịch (không có cảnh báo), nhưng đầu ra bây giờ là "Base :: Int!".
—
& dagger; Tôi không thể nghĩ ra một từ tiếng Anh cho "những người có thói quen" và "nghiện" là quá mạnh.
Nguồn
2009-05-20 14:31:59
Sẽ hữu ích nếu bạn đăng (nếu có thể) mã thực tế. Mã bạn đăng thiếu một số chi tiết, như dấu chấm phẩy sau định nghĩa lớp và kiểu trả về cho 'a' trong' bar' ... –
Tôi không thể đăng mã thực. Tôi đã thêm chi tiết vào bài đăng, điều này không thực sự có ý nghĩa như một bài tập về cú pháp. – Greg
http://stackoverflow.com/questions/72010/c-overload-resolution –