Skip to main content

Hàm ảo là gì?

Một hàm ảo là một hàm, được xác định trong một siêu lớp, phải có trong một lớp con cho lớp con đó có một định nghĩa lớp hoàn chỉnh.Các hàm ảo dựa vào mô hình lập trình hướng đối tượng được gọi là kế thừa ảo, thường thấy nhất trong C ++ bằng cách sử dụng từ khóa ảo.Để xác định một hàm ảo, hai lớp là cần thiết, một siêu lớp và một lớp con.Các lớp học là nơi chức năng được khai báo đầu tiên và có thể được xác định.Lớp con là nơi hàm được xác định mdash;hoặc ghi đè, tùy thuộc vào việc chức năng được xác định trong siêu lớp. Hàm ảo có thể được xác định theo một trong hai cách.Đầu tiên, nó có thể được định nghĩa là một cuống, trong đó nó có một cơ thể trống rỗng và không làm gì cả.Thứ hai, nó có thể được định nghĩa là một hàm ảo thuần túy, trong đó nó được định nghĩa là null trong tệp tiêu đề siêu lớp.Có những ưu điểm và nhược điểm đối với cả hai phương pháp.Xác định một chức năng như một sơ khai đảm bảo rằng tất cả các lớp con có một số triển khai của nó, ngay cả khi nó không làm gì cả.Tuy nhiên, nếu người ta quên ghi đè chức năng và thực hiện đúng trong một lớp con, thì không có lỗi hoặc cảnh báo nào sẽ xuất hiện để chỉ ra điều này.Mặt khác, việc xác định một hàm ảo thuần túy yêu cầu mỗi lớp con phải có định nghĩa riêng về hàm và các lỗi sẽ xuất hiện nếu đây không phải là trường hợp.Các chức năng ảo, do đó các hệ thống phân cấp kế thừa với nhiều hơn hai cấp có thể không yêu cầu các định nghĩa rõ ràng về các chức năng ảo.Ví dụ, người ta có thể xem xét một lớp A tuyên bố một hàm ảo, được thực hiện trong lớp phụ B. Lớp B có một lớp con của riêng nó, Class C. C không yêu cầu định nghĩa rõ ràng về lớp là chức năng, vì nó kế thừaĐịnh nghĩa từ lớp B. Nếu cần, lớp C có thể ghi đè chức năng lớp BS hoặc nó có thể ghi đè chức năng lớp BS trong khi cũng gọi nó.Ở cực đoan khác, các hàm ảo không phải được xác định trong một lớp con nếu chúng được tuyên bố ảo trong lớp con đó.Ví dụ, người ta có thể xem xét một lớp A tuyên bố hàm ảo và có hai lớp con, B và C. Ngoài ra, người ta có thể tưởng tượng rằng lớp B có các lớp con D và E, và lớp con C có các lớp con F và G.B qua g tất cả phải có lớp là hàm ảo được xác định bằng cách nào đó.Nếu Lớp B có việc thực hiện chức năng AS, các lớp D và E không cần được làm lại.Có lẽ các lớp con CS cần phải thực hiện dưới dạng chức năng, nhưng cả hai đều làm một cái gì đó khác biệt, vì vậy việc xác định chức năng trong bản thân lớp C sẽ không hữu ích.Trong trường hợp đó, hàm có thể được khai báo ảo trong lớp C và việc triển khai là không cần thiết..Có nhiều cạm bẫy với các chức năng ảo, tuy nhiên, đặc biệt là liên quan đến nhiều kế thừa.Trong nhiều kế thừa, có thể các chức năng ảo được xác định mơ hồ để xung đột với nhau, vì vậy chúng nên được sử dụng một cách thận trọng trong bối cảnh đó.