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 ạ
Bài liên quan
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
.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
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ọidelete 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.
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…
vậy là được rồi cảm ơn bạn nhiều 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.
sửa lại cụ thể hơn 1 tí =) ko sử dụng polymorphic delete