Protected destructor và private destructor trong C++

Mọi người giúp mình về phần này với… bài viết này thì đề cập tới việc nên dùng private cho destructor còn ờ đây thì có 2 ý kiến trái chiều giữa việc sử dụng protected destructor và không nên dùng… vốn tiếng anh của mình cũng hạn chết nên cũng không hiểu rõ ý của người viết lắm, đối với hàm này thì việc sử dụng private hay protected là cần thiết nhất, mong mọi người giúp ạ :relaxed:

Hai bài trả lời hai câu hỏi khác nhau mà bạn: một bên không cho delete vì là hàng share, không ai có quyền xóa; một bên là vì interface không được có (thực ra ở đây là public) delete.

2 Likes

cho mình hỏi luôn khi nào thì nên dùng protected và khi nào thì dùng private? cảm ơn bạn :slight_smile:

Private thì chỉ sử dụng trong lớp được khai báo.
Protect thì mởi rộng hơn một chút là có thể sử dụng và override trong lớp kế thừa.

à cái đó mình biết… ý mình là khi nào thì sử dụng private destructor, khi nào thì protected destructor ?

private dtor cho class A: ko thể tạo object A trên stack được (vì ko thấy dtor của A, ko thể tự động hủy object của class A), khiến cho ko có class nào kế thừa từ A được (vì lớp con cần biết dtor của lớp cha, private ẩn dtor của lớp cha đi ko cho lớp con thấy)
khi nào nên dùng private dtor: khi bạn ko thích xài dtor của C++ mà muốn tự tạo ra 1 hàm riêng để hủy object của class A cho gần gũi với C hơn (aka rất hiếm khi hoặc ko bao giờ)

protected dtor cho class A: ko thể tạo object A trên stack được, nhưng có thể kế thừa từ A, nhưng lại ko sử dụng hết chức năng đa hình được: ko thể gọi delete pa nếu pa là con trỏ tới obj lớp A, chỉ có thể gọi delete pb với pb là con trỏ tới obj lớp B (nếu dtor của B là public).
khi nào nên dùng protected dtor: khi bạn biết chắc A sẽ ko sử dụng polymorphic delete trong đa hình.

4 Likes

cho mình hỏi thêm 1 câu nữa ạ: trong trường hợp 2 nghĩa là B là kế thừa của A, và ta chỉ có thể gọi delete từ class B đúng không?

nếu dtor của B là public thì có thể gọi được

em đọc thêm: http://www.gotw.ca/publications/mill18.htm
ở guildeline#4 có nói dtor 1 là public virtual 2 là protected non-virtual

cứ phang public dtor hết cho nó khỏe, suy nghĩ chi cho mệt =) Muốn thiết kế code chắc chắn thì nghiên cứu thêm cái protected dtor…

2 Likes

vậy là được rồi :heart_eyes: cảm ơn bạn nhiều nhé :grinning: :grinning: :grinning:

Không hẳn :slight_smile: không đa hình đầy đủ thì đúng, nhưng không hẳn là không được (chỉ cần tính năng chính). Khi feed một đối tượng vào bất cứ chỗ nào thì nó đều có thể bị hủy, nên sẽ phải khóa lại chỉ để derived dùng.

2 Likes

sửa lại cụ thể hơn 1 tí =) ko sử dụng polymorphic delete

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?