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 ++.
để "bỏ ẩn" chức năng thành viên ban đầu. –
+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ế. –