2009-06-16 34 views
7

Nếu chúng ta định nghĩa một lớp trừu tượng có một destructor ảo thuần túy, tại sao chúng ta phải đưa ra một định nghĩa về một destructor trong lớp trừu tượng?Câu hỏi về destructor ảo tinh khiết

+0

Duplicate http://stackoverflow.com/questions/630950/pure-virtual-destructor-in-c – ralphtheninja

Trả lời

15

Hàm hủy cho lớp cơ sở phải được gọi khi đối tượng bị hủy, do đó cần định nghĩa.

9

Như đã được Jesse chỉ ra, các trình phá hủy kế thừa luôn được gọi (trình biên dịch được gọi cho bạn bằng cách không có cách nào để ghi đè hành vi này), vì vậy nó là lý do khiến một trình phá hủy ảo phải thực hiện. Vì vậy, nếu một destructor ảo tinh khiết phải có một thực hiện, sự khác biệt giữa một destructor ảo tinh khiết và một destructor ảo thường xuyên là gì? Nếu lớp trừu tượng của bạn chỉ có khai phá ảo được khai báo và không có các phương thức ảo thuần túy nào khác, làm cho destructor tinh khiết sẽ ngăn cản ai đó có thể khởi tạo lớp trừu tượng.

3

Chỉ một dtor ảo mới có thể được khai báo là thuần túy. Nhưng sau đó, kể từ khi bạn thêm một tuyên bố, bạn phải thực hiện cơ thể của dtor. Như đã đề cập, các destructors gọi dtor cha mẹ của họ, tất cả lên đến chuỗi thừa kế.

9

Bởi vì tiêu chuẩn nói vậy:

12.4.7 Destructor thể được khai báo ảo (10,3) hoặc tinh khiết ảo (10.4); nếu bất kỳ đối tượng nào của lớp đó hoặc bất kỳ lớp dẫn xuất nào được tạo ra trong chương trình, thì hàm hủy được xác định.

Lý do cho điều này là nó được gọi một cách rõ ràng khi đối tượng của lớp dẫn xuất bị hủy.

Xem thêm câu trả lời cho câu hỏi trước đây của tôi: Under what circumstances is it advantageous to give an implementation of a pure virtual function?

+0

Có gì sai với câu trả lời này? Hoặc SO cho vấn đề đó? – Tobias

+1

Không đúng khi nói rằng nó được gọi là "rõ ràng". Việc bạn tham chiếu tiêu chuẩn là hữu ích, nhưng bạn nên chỉnh sửa câu trả lời của mình để câu trả lời chính xác hơn. "một cách rõ ràng" là ngược lại với cách mà các destructor thường được gọi. – nobar