Java và C# hỗ trợ khái niệm về các lớp không thể được sử dụng làm lớp cơ sở với các từ khóa final
và sealed
. Trong C + + tuy nhiên không có cách nào tốt để ngăn chặn một lớp học được bắt nguồn từ đó rời khỏi tác giả của lớp với một tiến thoái lưỡng nan, nên mỗi lớp có một destructor ảo hay không?Mọi lớp học có hủy diệt ảo không?
Edit: Kể từ C++ 11 này không còn đúng, bạn có thể xác định rằng một lớp là final
.
Một mặt cho một đối tượng một destructor ảo có nghĩa là nó sẽ có một vtable
và do đó tiêu thụ 4 (hoặc 8 trên máy 64 bit) byte thêm mỗi đối tượng cho vptr
. Mặt khác, nếu một người nào đó sau đó xuất phát từ lớp này và xóa một lớp dẫn xuất thông qua một con trỏ đến lớp cơ sở, chương trình sẽ không được xác định (do sự vắng mặt của một destructor ảo), và thẳng thắn tối ưu hóa cho một con trỏ trên mỗi đối tượng là vô lý.
Trên gripping hand có trình phá hủy ảo (được cho là) quảng cáo loại này có nghĩa là được sử dụng đa hình.
Một số người nghĩ rằng bạn cần một lý do rõ ràng để không sử dụng một destructor ảo (như là văn bản phụ của this question) và những người khác nói rằng bạn nên sử dụng chúng chỉ khi bạn có lý do để tin rằng lớp học của bạn có nguồn gốc từ, bạn nghĩ gì?
Đã có câu hỏi về ưu điểm khuyết điểm - đây có phải là bản sao hoặc nó được dự định là cuộc thăm dò ý kiến không? Nếu sau này, có thể bạn nên tạo câu trả lời "có" và "không" để bỏ phiếu, sau đó đóng câu hỏi? Tôi nghĩ đó là cách được khuyến nghị để triển khai cuộc thăm dò đa lựa chọn trên SO. –
Bản sao: http://stackoverflow.com/questions/270917/why-should-i-declare-a-virtual-destructor-for-an-abstract-class-in-c, http://stackoverflow.com/questions/300986/khi-nên-bạn-không-sử dụng-ảo-destructors –
"và thẳng thắn tối ưu hóa cho một con trỏ cho mỗi đối tượng là vô lý." - Nó không vô lý cho các đối tượng nhỏ. C++ 0x đang thêm một container forward_list, chính xác vì đôi khi một con trỏ trên mỗi đối tượng trên không quá nhiều - từ các yêu cầu về không gian và thời gian. –