Khi trình biên dịch có nhiều hơn một cách để giải quyết một biểu tượng, nó phải chọn cái nào có độ ưu tiên trừ phi mã cho nó bằng cách khác . Những gì bạn đang mong đợi là quá tải để được ưu tiên hơn trọng tài. (hơn, hơn, hơn, aaaaack! Xin lỗi, bị 'quá sức').
Ví dụ này có B kế thừa phương thức ảo trong đó lớp con cung cấp phiên bản quá tải. Quá tải là cho các phương thức trong cùng một lớp bằng cách sử dụng cùng một tên phương thức nhưng có chữ ký khác nhau. Vì B là một phân lớp của A, nó ghi đè f(), điều đó có nghĩa là nó không thể là quá tải cùng một lúc. Đây là lý do tại sao nó đang được ẩn.
Đối với lớp A, phương pháp
virtual void f() {}
làm phương tiện ảo phương pháp đó sẽ được giải quyết bằng một tập hợp các quy tắc mà không phù hợp với tuyên bố của bạn của b tuyên bố.
B *b = new B();
Bằng cách tạo 'b' làm trường hợp "B", trình biên dịch không cần sử dụng bản chất ảo của cùng một phương thức trong "A".
Nếu bạn đã tuyên bố 'b' như thế này
B *b = new A();
sau đó cuộc gọi b-> f(); thực sự sẽ đề cập đến phương pháp trong A bằng cách sử dụng độ phân giải ảo.
Nguồn
2010-11-10 16:19:28
Có lẽ bạn muốn lấy 'b' từ' A'? –