2009-03-10 40 views
136

Có sai lầm khi viết:tinh khiết destructor ảo trong C++

class A { 
public: 
    virtual ~A() = 0; 
}; 

cho một lớp cơ sở trừu tượng?

Ít nhất là biên dịch trong MSVC ... Nó có bị lỗi khi chạy không?

+7

Nó có thể biên dịch, nhưng nó có liên kết không? –

Trả lời

182

Có. Bạn cũng cần triển khai trình phá hủy:

class A { 
public: 
    virtual ~A() = 0; 
}; 

inline A::~A() { } 

là đủ.

Và vì điều này có một cuộc bỏ phiếu xuống, tôi nên làm rõ: Nếu bạn lấy được bất cứ điều gì từ A và sau đó cố gắng xóa hoặc phá hủy nó, hủy diệt của A cuối cùng sẽ được gọi. Kể từ khi nó là tinh khiết và không có một thực hiện, hành vi không xác định sẽ xảy ra. Trên một nền tảng phổ biến, điều đó sẽ gọi trình xử lý thông minh và sự cố.

Edit: sửa chữa tờ khai phải tuân thủ QTI hơn, biên soạn với http://www.comeaucomputing.com/tryitout/

+0

Vì vậy, nó phải được khai báo ảo ~ A() {}, không có "= 0". Nó không phải là ảo tinh khiết nếu bạn cung cấp một thực hiện – jalf

+15

Um, đúng vậy. Tinh khiết chỉ có nghĩa là một lớp dẫn xuất cũng cần phải cung cấp một thực hiện. – MSN

+65

Thực hiện các chức năng ảo thuần túy thực tế là hợp pháp. Rất hữu ích để cung cấp việc triển khai mặc định nhưng buộc các lớp con gọi nó một cách rõ ràng. – jmucchiello

45

destructors cá nhân: họ sẽ cung cấp cho bạn một lỗi khi bạn tạo một đối tượng của một lớp có nguồn gốc - không khác. Một chẩn đoán có thể xuất hiện mặc dù.

12,4 Destructors

6 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ớp học có trình hủy ảo thuần túy là lớp trừu tượng. Lưu ý tốt:

10,4 Các lớp trừu tượng

2 Một hàm ảo thuần tuý cần được xác định chỉ khi gọi với, hoặc như thể với (12,4), cú pháp có trình độ-id (5.1).

[Note: phần khai báo hàm không thể cung cấp cả một tinh khiết-specifier và một định nghĩa -end note]

Taken trực tiếp từ dự thảo:

struct C { 
    virtual void f() = 0 { }; // ill-formed 
}; 
+11

+1. Tôi nghĩ Herb Sutter cũng có một số thông tin tốt về điều này: http://www.gotw.ca/gotw/031.htm. Thật thú vị khi lưu ý rằng bất kỳ hàm ảo thuần túy nào cũng có thể có một triển khai được cung cấp, chứ không phải chỉ là các trình phá hủy. –

+6

Vâng, đó là điều bạn làm trong một cuộc phỏng vấn để làm phiền những người phỏng vấn của bạn;) – dirkgently

+1

Nó thực sự không phải là tất cả những gì không phổ biến, theo kinh nghiệm của tôi. –

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