Có sự khác biệt nào giữa trình phá hoại được bảo vệ và riêng tư trong C++ không? Nếu một lớp cơ sở destructor là riêng tư, tôi tưởng tượng rằng nó vẫn được gọi là khi xóa đối tượng lớp dẫn xuất.Được bảo vệ và hủy riêng tư
Trả lời
Taken từ here:
Nếu constructor/destructor được khai báo là private thì lớp có thể không được khởi tạo.
Điều này đúng, tuy nhiên nó có thể được khởi tạo từ một phương pháp khác trong lớp học. Tương tự, nếu destructor là private
, thì đối tượng chỉ có thể bị xóa khỏi bên trong lớp đó. Ngoài ra, nó ngăn cản các lớp được thừa hưởng (hoặc ít nhất, ngăn chặn các lớp kế thừa từ được instantiated/phá hủy ở tất cả).
public class A {private A() {} public A getA() {return new A(); }} Không chính xác. –
Điều đó không đúng. Đối tượng với riêng destructor * có thể * được instantiated, (trên một ngăn xếp bên trong một chức năng người bạn, ví dụ). – SadSido
Không thể ngăn xếp được phân bổ nhưng có thể được cấp phát heap và cũng từ các chức năng của bạn bè ... –
Nếu trình phá hủy lớp cơ sở là private
hoặc protected
thì bạn không thể gọi delete
thông qua con trỏ cấp cơ sở.
Sử dụng trình phá hủy được bảo vệ để ngăn chặn sự phá hủy đối tượng có nguồn gốc thông qua một con trỏ cơ sở. Nó hạn chế quyền truy cập vào destuctor đến các lớp dẫn xuất. Và nó ngăn chặn các đối tượng tự động (stack) của cơ sở lớp.
Trong thực tế nó được sử dụng cho phép bất kỳ khác sử dụng đa hình của nguồn gốc lớp thông qua con trỏ đến cơ sở, nhưng không cho phép người dùng xóa bằng cách sử như một con trỏ . Ví dụ: - Lớp cơ sở trừu tượng/Giao diện.
Nhưng một số protected
, non-virtual
destructor có vẻ là lỗi đang chờ xảy ra. Giả sử bạn không cung cấp chức năng destroy()
, bạn phải cuối cùng biến dtor thành công khai. Ngay sau khi bạn làm điều đó, bạn không có quyền kiểm soát nhiều hơn lớp, và chạy nguy cơ xóa đa hình với một dtor phi ảo, nếu ai đó xuất phát xa hơn từ lớp của bạn.
Các đoạn mã sau đây sẽ dẫn đến lỗi biên dịch (VC2010): C2248: 'cơ sở :: ~ cơ sở': không thể truy cập thành viên tin khai báo trong lớp 'cơ sở'
class base
{
~base(){}
};
class derived : public base
{
};
int main()
{
derived* d = new derived;
delete d;
}
Tuy nhiên, nếu bạn thay đổi destructor cơ sở để được bảo vệ, mọi thứ hoạt động tốt.
Nhưng ngay cả khi bạn thay đổi nó thành 'protected', bạn không thể phá hủy các đối tượng thông qua một con trỏ lớp cơ sở. (Trong trường hợp đó nó cũng phải là 'virtual', BTW.) Mà phần nào đánh bại nhiều mục đích của derivation ... – sbi
Câu trả lời là giả định của bạn sai. Trình phá hủy lớp cơ sở không thể được gọi khi nó là riêng tư.
- 1. biến riêng tư hoặc được bảo vệ?
- 2. Khối Riêng tư/Được bảo vệ trong Ruby?
- 3. Đảm bảo đầu vào của các phương thức riêng tư/được bảo vệ?
- 4. Doxygen: ẩn phương pháp riêng tư/được bảo vệ ... và mẹo
- 5. Công khai, riêng tư và được bảo vệ trong lập trình hướng đối tượng là gì?
- 6. Các lớp C++ (công khai, riêng tư và được bảo vệ)
- 7. không thể xác định hàm tạo như được bảo vệ hoặc riêng tư! tại sao?
- 8. Trường C# được bảo vệ thành riêng tư, thêm thuộc tính - tại sao?
- 9. Tôi có thể làm gì với biến tĩnh được bảo vệ/riêng tư?
- 10. Khi nào chúng ta nên xem xét sử dụng riêng tư hoặc được bảo vệ?
- 11. c + +, được bảo vệ cơ sở ảo trừu tượng tinh khiết hủy hoại riêng ảo
- 12. Phạm vi tư nhân, bảo vệ, và công chúng
- 13. sự khác biệt giữa các bộ sửa đổi truy cập được bảo vệ và gói riêng tư trong Java?
- 14. Có sự khác biệt nào giữa chức năng ảo thuần túy được bảo vệ và riêng tư không?
- 15. respond_to? và phương pháp được bảo vệ
- 16. Cách bảo vệ API REST riêng tư trong ứng dụng AJAX
- 17. Bảo mật cho REST "Riêng tư" REST
- 18. Cách bảo vệ REST API riêng lẻ
- 19. Bảo mật và quyền riêng tư trên đám mây
- 20. Có cách nào để đặt thuộc tính tĩnh riêng tư/được bảo vệ bằng các lớp phản chiếu không?
- 21. Lịch sử của các công cụ sửa đổi kiểm soát truy cập như công khai/riêng tư/được bảo vệ
- 22. Các phương pháp tĩnh PHP có thể hợp pháp có được sự bảo vệ riêng tư hay không?
- 23. Hoàn thành mã cho biến thành viên riêng tư/được bảo vệ khi sử dụng phép thuật __get()
- 24. ghi đè nội bộ được bảo vệ bằng bảo vệ!
- 25. bảo vệ mã node.js
- 26. được bảo vệ nội bộ
- 27. chức năng ảo trong kế thừa riêng hoặc được bảo vệ
- 28. Phương thức "công khai/được bảo vệ/riêng tư" được triển khai như thế nào và tôi có thể mô phỏng nó như thế nào?
- 29. Tại sao Riêng tư và Được bảo vệ cho cách một Sự kiện Nhấp Nút được tạo trong ASP.NET bằng cách sử dụng VB.NET?
- 30. phương pháp được bảo vệ bằng mocking
Bạn sẽ gặp một số vấn đề phát sinh từ lớp học với destructor riêng =) – SadSido
Trùng lặp cho http://stackoverflow.com/questions/631783/what-is-the-use-of-having-destructor-as-private ? – SadSido
Câu hỏi tương tự ở đây: http://stackoverflow.com/questions/224966/private-and-protected-members-c – Jordan