Tôi có một dự án thú cưng mà tôi đã thử nghiệm với các tính năng mới của C++ 11. Trong khi tôi có kinh nghiệm với C, tôi khá mới với C++. Để rèn luyện bản thân mình thành các phương pháp hay nhất, (ngoài việc đọc nhiều), tôi đã bật một số tham số trình biên dịch nghiêm ngặt (sử dụng GCC 4.4.1):Tại sao enable_shared_from_this có một destructor không ảo?
-std=c++0x -Werror -Wall -Winline -Weffc++ -pedantic-errors
Điều này đã làm việc tốt cho tôi. Cho đến bây giờ, tôi đã có thể giải quyết mọi trở ngại. Tuy nhiên, tôi có nhu cầu cho enable_shared_from_this
và điều này gây ra sự cố cho tôi. Tôi nhận được cảnh báo sau (lỗi, trong trường hợp của tôi) khi biên dịch mã của tôi (có lẽ kích hoạt bởi -Weffc++
):
base class ‘class std::enable_shared_from_this<Package>’ has a non-virtual destructor
Vì vậy, về cơ bản, tôi là một chút nghe trộm bằng cách thực hiện này của enable_shared_from_this
, bởi vì:
- Trình phá hủy của lớp là nhằm mục đích cho phân lớp phải luôn là là ảo, IMHO.
- Trình hủy không có gì, tại sao lại có nó?
- Tôi không thể tưởng tượng bất kỳ ai muốn xóa cá thể của họ bằng cách tham chiếu đến
enable_shared_from_this
.
Nhưng tôi đang tìm cách để giải quyết vấn đề này, vì vậy câu hỏi của tôi thực sự là có cách thích hợp để giải quyết vấn đề này không? Và: tôi đúng khi nghĩ rằng destructor này là không có thật, hoặc là có một mục đích thực sự cho nó?
Bạn đã thử kế thừa riêng tư hoặc được bảo vệ? Nó có thay đổi chẩn đoán không? – Tomek
Đó là một ý tưởng tuyệt vời. Nhưng thật không may, nó không. –
'-WeffC++' kích hoạt rất nhiều cảnh báo vô nghĩa (như liên quan đến thư viện) từ thư viện chuẩn, và điều này được đề cập trong [FAQ] (http://gcc.gnu.org/onlinedocs/libstdc++/faq.html # faq.wefcxx_verbose) –