Nếu hàm được khai báo không ảo trong lớp dẫn xuất khi hàm lớp cơ sở là virutal, tại sao nó gọi một tra cứu vtable khi gọi hàm trên con trỏ của nó? Hàm này rõ ràng từ phạm vi.chức năng ảo khai báo không ảo trong lớp dẫn xuất
Trả lời
Trong C++ nếu bạn khai báo phương thức virtual
trong lớp cơ sở thì nó cũng nằm trong lớp dẫn xuất, ngay cả khi từ khóa virtual
bị bỏ qua.
Tuy nhiên, vì mục đích tài liệu, tôi rất vui được lặp lại nó.
Khi một lớp kế thừa hàm ảo, bất kỳ khai báo mới, ghi đè nào của hàm đó sẽ tự động được tạo ảo, ngay cả khi từ khóa virtual
không được sử dụng.
Chức năng vẫn là ảo (giả sử nó có cùng một hoặc một chữ ký covariant). Sử dụng virtual
khi ghi đè thừa.
Bạn không thể thực hiện một chức năng không ảo, vì vậy nó sẽ vẫn ảo và một cuộc gọi đến chức năng nói chung cũng là ảo. Tất nhiên, có những tình huống mà trình biên dịch sẽ có thể tối ưu hóa điều này và thực hiện cuộc gọi trực tiếp, nhưng không bảo đảm trong trường hợp của bạn.
Phương thức ảo được tạo để tác động lên lớp dẫn xuất (Khi bạn đánh dấu một phương thức là ảo. Nó sẽ sử dụng vtable trên các lớp dẫn xuất). Và các phương pháp ghi đè sẽ là ảo.
- 1. Sử dụng 'ảo' trong lớp dẫn xuất
- 2. Thừa kế chức năng ảo
- 3. chức năng ảo const vs chức năng ảo không const
- 4. C++ "chức năng ảo nhưng không có hàm hủy ảo"
- 5. C++ chức năng ảo không được gọi trong lớp con
- 6. Chức năng ảo có ghi đè lên một hàm không phải ảo trong cùng một lớp cơ sở không?
- 7. Khi nào bạn nên hạn chế khả năng truy cập vào một chức năng ảo trong một lớp dẫn xuất?
- 8. C++: chức năng ảo cá nhân so với khái niệm hàm ảo thuần túy
- 9. Quá tải chức năng ảo tinh khiết
- 10. Hành vi chức năng ảo trong C++
- 11. Chức năng ảo có thể bị ghi đè bởi một chức năng phi ảo không?
- 12. Xóa chức năng ảo trong C++ 0x
- 13. chức năng ảo nội tuyến
- 14. Chức năng ảo Mimic (thuần) ảo như C#
- 15. C++ ảo Const Chức năng
- 16. Chức năng ảo thuần túy nằm ở đâu trong C++?
- 17. Gọi chức năng ảo thuần túy từ chức năng thành viên lớp cơ sở trừu tượng?
- 18. Biến tham chiếu và chức năng ảo
- 19. chức năng ảo tư nhân ở có nguồn gốc lớp
- 20. Async programmic và ảo chức năng
- 21. Force gọi lớp cơ sở chức năng ảo
- 22. Câu hỏi với các chức năng ảo
- 23. Tại sao chức năng ảo bị ẩn?
- 24. gcc 4.7.2 lỗi chức năng ảo
- 25. Chức năng ảo không được liệt kê trong vptr
- 26. Sử dụng "Công khai" trong khai báo lớp dẫn xuất?
- 27. typecasting với các chức năng ảo
- 28. Gọi chức năng ảo từ bảng V
- 29. Overhead của kế thừa C++ không có chức năng ảo
- 30. Ghi đè rõ ràng chức năng ảo
Nó có thể là dự phòng cho trình biên dịch nhưng nó là tài liệu tốt cho bất kỳ người nào sử dụng lớp. –
@LokiAstari: đúng. – PlasmaHH