Mã C++ có thể được biên dịch với thông tin loại thời gian chạy bị tắt, điều này sẽ vô hiệu hóa dynamic_cast
. Tuy nhiên, các phương thức ảo (đa hình) vẫn cần phải được gửi dựa trên kiểu thời gian chạy của đích. Tuy nhiên, điều đó có nghĩa là thông tin về loại có hiện diện hay không và dynamic_cast
sẽ luôn có thể hoạt động?Không có RTTI nhưng vẫn là phương pháp ảo
Trả lời
Tắt RTTI giết chết dynamic_cast
và typeid
nhưng không ảnh hưởng đến chức năng ảo. Các hàm ảo được gửi qua "vtable" của các lớp có bất kỳ hàm ảo nào; nếu bạn muốn tránh việc có vtable, bạn chỉ đơn giản là không có chức năng ảo.
Rất nhiều mã C++ trong tự nhiên có thể làm việc mà không dynamic_cast
và gần như tất cả của nó có thể làm việc mà không typeid
, nhưng tương đối ít C ứng dụng ++ sẽ tồn tại mà không cần bất kỳ chức năng ảo (hoặc nhiều hơn vào vấn đề, chức năng mà họ dự kiến sẽ được ảo trở thành không phải ảo).
Một bảng ảo (vtable) chỉ là một con trỏ trên mỗi bảng tìm kiếm cho tất cả các hàm ảo. Bạn chỉ trả tiền cho những gì bạn sử dụng (Bjarne yêu thích triết lý này, và ban đầu chống lại RTTI). Với RTTI đầy đủ, bạn kết thúc với các thư viện và thực thi của bạn có khá nhiều chuỗi phức tạp và các thông tin khác được đưa vào để mô tả tên của từng loại và có lẽ những thứ khác như quan hệ phân cấp giữa các loại.
Tôi đã thấy các hệ thống sản xuất khi vô hiệu hóa RTTI đã thu nhỏ kích thước tệp thi hành xuống 50%. Hầu hết điều này là do các tên chuỗi lớn kết thúc trong một số chương trình C++ sử dụng nhiều mẫu.
Ok, do đó, 'dynamic_cast' cần thêm thông tin. Nhưng có vẻ như 'typeid' vẫn có thể hoạt động, ít nhất là đối với các loại có vtable. Con trỏ vtable có thể được truy cập thủ công từ mã C++ không? –
'typeid' không thể hoạt động vì một trong những mục đích chính của nó là cung cấp tên cho từng loại, và những tên đó (các chuỗi được ngắt null thực tế) không được phát ra thành các tệp đối tượng không có RTTI. Và không, vtable không thể được truy cập theo cách thủ công theo cách di động trong C++. Có thể có những cách cụ thể cho nền tảng, nhưng ngay cả đó là IMO hiếm. –
Ồ, xin lỗi tôi. :) Tôi giả định, mà không kiểm tra, rằng 'typeid' trả về một số loại số nguyên/con trỏ xiên. Làm cho cảm giác rằng nó không hoạt động nếu đó là một chuỗi (edit: thực sự 'class type_info'). –
- 1. Phương pháp ảo không được gọi là
- 2. Phương pháp trừu tượng có phải là ảo không?
- 3. Tôi nghĩ rằng tôi đã ghi đè một phương pháp ảo nhưng tôi vẫn nhận được: "X phải thực hiện phương pháp ảo thuần túy Y"
- 4. FreePascal RTTI. Có cách nào để gọi phương pháp?
- 5. Java - Phương pháp ảo
- 6. Mocking phương pháp không ảo trong C#
- 7. Các phương pháp không ảo trong Java
- 8. Cảnh báo 'có phương pháp ảo ... nhưng cảnh báo hủy không ảo' có nghĩa là gì trong quá trình biên dịch C++?
- 9. C++ "chức năng ảo nhưng không có hàm hủy ảo"
- 10. Phương pháp mở rộng ảo?
- 11. phương pháp phi ảo Overriding
- 12. C++ phương pháp ảo trọng
- 13. shared_ptr không có RTTI?
- 14. Tôi có thể sử dụng phương pháp ghi đè phương pháp phi ảo không?
- 15. Làm thế nào để quá tải một phương pháp ảo khác với phương pháp phi ảo?
- 16. C++ ghi đè phương pháp ảo thuần túy với phương pháp ảo thuần túy
- 17. ghi đè phương pháp ảo C++
- 18. Không ghi đè một phương pháp ảo không phải là const ẩn một quá tải const?
- 19. Tránh dynamic_cast/RTTI
- 20. Gọi phương pháp trẻ từ phương pháp cơ bản mà không cần tham khảo ảo hoặc
- 21. com.android.support:customtabs: Không có phương thức ảo launchUrl
- 22. Chúng ta có thể có một phương pháp tĩnh ảo không? (C++)
- 23. phương pháp với Nunit nhưng WebOperationContext Testing WCF là null
- 24. Danh tính lớp không có RTTI
- 25. Cài đặt Moq không hoạt động, phương pháp gốc vẫn được gọi là
- 26. Có thể có Phương pháp bên trong Phương pháp không?
- 27. Có thể ghi đè phương thức không phải ảo không?
- 28. Phương thức riêng được giả lập với PowerMock, nhưng phương thức cơ bản vẫn được gọi là
- 29. Có trường hợp sử dụng cho các phương pháp riêng ảo công cộng không?
- 30. Có thể hoàn thành một phương pháp ảo trong C# không?
Tôi đoán là vtable vẫn còn hiện diện nhưng vì nó không chứa bất kỳ thông tin kiểu nào (chỉ các con trỏ hàm) các chức năng ảo sẽ vẫn hoạt động. –
Bản sao có thể có của http://stackoverflow.com/questions/4486609/when-can-compiling-c-without-rtti-cause-problems ...? –
Để làm cho dynamic_cast hoạt động (trong trường hợp phức tạp với nhiều thừa kế), bạn cần một cái gì đó nhiều hơn các bảng chức năng ảo – marom