xem xét ví dụ dưới đây:Override một hàm thành viên với nhau trở lại loại
#include <iostream>
using namespace std;
class base
{
public:
virtual int func()
{
cout << "vfunc in base class\n";
return 0;
}
};
class derived: public base
{
public:
double func()
{
cout << "vfunc in derived class\n";
return 0;
}
};
int main()
{
base *bptr = new derived;
bptr->func();
return 0;
}
Trình biên dịch đưa ra một lỗi cho các mã trên rằng có loại mâu thuẫn với chức năng ghi đè. Tại sao không thể ghi đè lên một hàm trong lớp dẫn xuất với một kiểu trả về khác?
Tôi tin rằng, theo thứ tự để ghi đè lên một hàm, phương thức ảo lớp cơ sở cần phải được định nghĩa lại trong lớp dẫn xuất. Để xác định lại một phương thức, chữ ký của các phương thức phải giống nhau. Vì kiểu trả về không phải là một phần của chữ ký, tôi tin rằng ngay cả khi có sự khác biệt về kiểu trả về, phương thức vẫn sẽ được định nghĩa lại? Trong trường hợp đó đối với mã ở trên, hàm ảo func
được định nghĩa lại trong lớp dẫn xuất có kiểu trả về khác. Nhưng trình biên dịch ném một lỗi. Tôi hiểu có đúng không?
Vì làm rõ, những gì trình biên dịch được tạo cho bạn lỗi gì? –
@SionSheevok, GCC có ít nhất: http://codepad.org/z7rXpCeK – bdonlan
@SionSheevok: Tôi đang sử dụng gcc 3.4.6 –