2012-12-05 38 views
6

Tôi cần phải thiết lập cấu trúc thừa kế lớp, trong đó lớp cơ sở trừu tượng chỉ chứa các biến thành viên (nhưng không có phương thức thành viên). Các phương thức thành viên sẽ được định nghĩa bởi các lớp dẫn xuất. Do đó, những gì tôi cần là bài đăng này: Making a class abstract without any pure virtual methodsconstructor được bảo vệ so với destructor ảo tinh khiết

Từ 2 câu trả lời trên đó, tôi nhận ra có 2 cách để đạt được nó:

  • Hãy destructor tinh khiết ảo.
  • Đảm bảo hàm tạo được bảo vệ.

Tôi tò mò muốn biết sự khác biệt giữa hai cách tiếp cận. Có những tình huống mà người ta nên được ưa thích hơn người khác (hoặc có thể một số tình huống đặc biệt mà người ta sẽ làm việc nhưng không phải là người khác)? Tôi nghĩ về nó và không thể nghĩ ra bất cứ điều gì.

Tôi đã tìm kiếm qua các câu trả lời trên một số bài đăng ở đây (Is there a use for making a protected destructor virtual?, C++: Protected Class Constructor, Should an abstract class' destructor be pure virtual?) để cố gắng kết hợp với nhau, nhưng tôi không thể đi đến kết luận.

Trả lời

3

Sự khác biệt chính là ở

Base * ptr = new Derived; 
delete ptr; 

Với destructor ảo nó là hợp pháp, mà không có nó sẽ có UB. Ngoài ra dynamic_cast yêu cầu ít nhất một chức năng ảo.
Vì vậy, nếu bạn muốn có hành vi đa hình, hãy sử dụng trình phá hủy ảo (thuần túy). Nếu bạn không muốn nó, hãy sử dụng hàm tạo được bảo vệ và không trả phí trên cho đa hình (vtables). Nhưng sau đó tuyên bố destructor cũng được bảo vệ, để ngăn chặn xóa thông qua con trỏ cơ sở.

+1

Điều này không * thực sự * trả lời câu hỏi của OP. Một destructor ảo không thuần túy có thể được sử dụng với trường hợp constructor được bảo vệ và mã ví dụ của bạn sẽ hiển thị hành vi đã xác định. Bạn đang nói về một vấn đề liên quan, nhưng trực giao. –

3

Cả hai cách đều đạt được hiệu quả mong muốn bằng cách sử dụng một cơ chế hoàn toàn khác. Theo tôi, một số protected constructor có tính biểu cảm hơn vì nó tương ứng chính xác với mô tả sự cố của bạn. Pure virtual destructor không phải là giải pháp tự nhiên và có thể yêu cầu tài liệu bổ sung để giải thích mục đích của nó. Nó cũng sẽ buộc các lớp con thực thi destructor ngay cả khi nó có thể bị bỏ qua.

+0

Tôi đọc rằng nếu bạn không thực hiện rõ ràng trình phá hủy trong lớp dẫn xuất, lớp được tạo tự động cho chúng là đủ. Vì vậy, các destructor ảo tinh khiết không ép buộc các lớp con để thực hiện destructors của họ. – Wutz

+0

@Wutz, mục đích là gì? –

+0

@Michael Krelin - hacker: Làm cho lớp trừu tượng cơ sở không có các phương thức ảo thuần túy. Nó có thể hữu ích cho phép lớp cơ sở định nghĩa các triển khai mặc định cho các phương thức ảo của nó và vẫn ngăn cản nó được trực tiếp khởi tạo. – Wutz

Các vấn đề liên quan