Ba từ khóa quyết định method nào chạy khi gọi qua tham chiếu lớp cha:
virtual: đánh dấu method của lớp cha cho phép ghi đè.override: lớp con thay thế thật sự method virtual → gọi qua tham chiếu cha vẫn chạy bản con (runtime dispatch = đa hình).new: lớp con che (hide) method của cha, không phải ghi đè. Method nào chạy phụ thuộc kiểu tham chiếu lúc biên dịch, không có đa hình.
csharp
class Animal { public virtual string Speak() => "..."; }
class Dog : Animal { public override string Speak() => "Gâu"; }
class Cat : Animal { public new string Speak() => "Meo"; }
Animal d = new Dog();
Animal c = new Cat();
d.Speak(); // "Gâu" → override: chạy bản con
c.Speak(); // "..." → new: che, tham chiếu Animal chạy bản chaChốt: muốn đa hình thật (gọi qua kiểu cha vẫn ra hành vi con) thì cặp virtual/override. new chỉ để giấu method trùng tên và thường là dấu hiệu thiết kế cần xem lại.