Trong C++, chức năng thành viên của lớp cơ sở có bị ghi đè bởi hàm lớp dẫn xuất của cùng tên, ngay cả khi nguyên mẫu (thông số, loại và constness) khác nhau? Tôi đoán đây là một câu hỏi ngớ ngẩn, vì nhiều trang web nói rằng nguyên mẫu hàm nên giống nhau cho điều đó xảy ra; nhưng tại sao mã dưới đây không biên dịch? Đó là một trường hợp thừa kế rất đơn giản, tôi tin.C++ thừa kế và chức năng ghi đè
#include <iostream>
using std::cout;
using std::endl;
class A {};
class B {};
class X
{
public:
void spray(A&)
{
cout << "Class A" << endl;
}
};
class Y : public X
{
public:
void spray(B&)
{
cout << "Class B" << endl;
}
};
int main()
{
A a;
B b;
Y y;
y.spray(a);
y.spray(b);
return 0;
}
GCC ném
error: no matching function for call to `Y::spray(A&)'
note: candidates are: void Y::spray(B&)
Có Câu hỏi thường gặp về C++ về cùng một vấn đề, để giải thích chi tiết nếu một số người yêu cầu nó :) http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq- 23.9 – legends2k
Hơi nguy hiểm khi nói rằng chữ ký phải giống nhau. Chữ ký là cơ sở cho việc mang tên và liên kết. Hai thành viên của các lớp khác nhau luôn luôn có chữ ký khác nhau, ngay cả khi một người ghi đè khác. Tốt hơn là nên nói "cùng loại thông số, tên và độ chói", tôi nghĩ, ngay cả khi nó dài hơn. –
@litb: Cảm ơn bạn đã làm rõ! Tôi đoán 'nguyên mẫu' là từ thích hợp ở đây, tôi đã thay đổi nó trong câu hỏi :) – legends2k