01/10/2018, 16:28

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 ạ

rogp10 viết 18:39 ngày 01/10/2018

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.

Cần Tây viết 18:40 ngày 01/10/2018

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

Văn Dương viết 18:33 ngày 01/10/2018

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ần Tây viết 18:40 ngày 01/10/2018

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

viết 18:44 ngày 01/10/2018

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.

Cần Tây viết 18:39 ngày 01/10/2018

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?

viết 18:41 ngày 01/10/2018

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…

Cần Tây viết 18:37 ngày 01/10/2018

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

rogp10 viết 18:32 ngày 01/10/2018

khi nào nên dùng protected dtor: khi bạn biết chắc A sẽ ko được sử dụng như 1 base class trong đa hình.

Không hẳn 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ị xóa, nên sẽ phải khóa lại chỉ để derived dùng.

viết 18:31 ngày 01/10/2018

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

Bài liên quan
0