đề cập khác so questionLẫn lộn về tên lẩn trốn và chức năng ảo
xem xét mã:
class Base {
public:
virtual void gogo(int a){
printf(" Base :: gogo (int) \n");
};
virtual void gogo(int* a){
printf(" Base :: gogo (int*) \n");
};
};
class Derived : public Base{
public:
virtual void gogo(int* a){
printf(" Derived :: gogo (int*) \n");
};
};
int main(){
// 1)
Derived * obj = new Derived ;
obj->gogo(7); // this is illegal because of name hiding
// 2)
Base* obj = new Derived ;
obj->gogo(7); // this is legal
}
Đối với trường hợp 2)
Cuộc gọi obj->gogo(7)
được giải quyết tại thời gian chạy.
Vì obj->gogo(7)
là hợp pháp. Dường như ngụ ý rằng vtable của Derived
chứa ptr đến virtual void gogo(int a)
cần được ẩn.
nhầm lẫn của tôi là, kể từ khi tên ẩn gây ra trường hợp 1) là bất hợp pháp, thì làm sao các cuộc gọi trong 2) đã được giải quyết tại thời gian chạy
a) Liệu vtable của nguồn gốc chứa con trỏ đến gogo (int).
b) Nếu a) không đúng, Độ phân giải cuộc gọi cho các hàm ảo có thể chuyển thành vtable của lớp cơ sở hay không.
@AndersK Hàm 'Base :: gogo (int)' thực sự bị ẩn bởi 'Derived :: gogo (int *)'. Nhưng câu lệnh 'using Base :: gogo;' trong lớp 'Derived' sẽ giải quyết vấn đề cụ thể này. –
@MichaelWild yep, tôi đã thấy sai lầm của mình. –