Như mọi người khác đã nói, B.Method2 được gọi. Dưới đây là một vài thông tin khác để bạn hiểu những gì đang xảy ra:
((A)B).Method2();
B.Method2();
Cả hai đều gọi B.Method1() vì nó được ghi đè đúng cách. Để gọi Method1 của A, phải có một lệnh gọi base.Method1() được thực hiện từ B (thường là nhưng không phải lúc nào cũng được thực hiện trong việc thực hiện B.Method1).
Tuy nhiên, nếu B được định nghĩa theo cách này:
class B:A {
new public void Method1() { }
... sau đó của một Method1() sẽ được gọi vì Method1 đã không thực sự ghi đè, đó là ẩn và giấu đi bên ngoài các quy tắc của đa hình. Nói chung, đây thường là một điều xấu để làm. Không phải luôn luôn, nhưng hãy chắc chắn rằng bạn biết rất rõ những gì bạn đang làm và tại sao bạn đang làm điều đó nếu bạn đã từng làm một cái gì đó như thế này.
Mặt khác, sử dụng mới theo cách này cũng tạo ra một số câu hỏi phỏng vấn thú vị.
Tại sao bạn không dùng thử? –
@ Jeff: Không quan trọng; B.Method1() vẫn là hàm được gọi. – apandit
tôi nghĩ rằng theo VMT (Bảng Phương pháp Vitual) phiên bản mới nhất của phương pháp ghi đè sẽ được gọi. để có thể B.Method1() – TalentTuner