2012-07-15 46 views
26

Trong C++ 11, chúng tôi có thể tuyên bố một destructor được tự động tạo:Mặc định tinh khiết destructor ảo

struct X { 
    virtual ~X() = default; 
}; 

Ngoài ra, chúng ta có thể khai báo một destructor là tinh khiết ảo:

struct X { 
    virtual ~X() = 0; 
}; 

Câu hỏi của tôi là: cách khai báo destructor là cả hai được tạo tự động virtual virtual? Trông giống như cú pháp sau đây là không đúng:

struct X { 
    virtual ~X() = 0 = default; 
}; 

Cả là một trong những điều này:

struct X { 
    virtual ~X() = 0, default; 
}; 

Cũng không phải cái này:

struct X { 
    virtual ~X() = 0 default; 
}; 

EDIT: Một số giải thích về mục đích của câu hỏi . Về cơ bản tôi muốn một lớp rỗng là lớp cơ sở không có khả năng khởi tạo, nhưng lớp dẫn xuất là khả thi, thì lớp đó phải có một trình phá hủy ảo thuần túy. Nhưng mặt khác, tôi không muốn cung cấp định nghĩa trong tệp .cpp. Vì vậy, tôi cần một số loại cơ chế tương đương với default. Tôi tự hỏi nếu có ai có ý tưởng để giải quyết vấn đề.

+2

Bạn có thể làm 'ảo ~ X() = 0 {}'? Bây giờ hãy nghĩ lại những gì bạn đang cố gắng làm. – Xeo

+4

@Xeo: Có, bạn có thể. Nhưng không phải với cú pháp đó; bạn phải cung cấp triển khai không trực tuyến. Bất kỳ hàm ảo thuần túy nào đều có thể thực hiện mặc định - điều đó đơn giản có nghĩa là các lớp dẫn xuất không trừu tượng * phải * thực hiện hàm, nhưng có thể gọi thực thi mặc định của cha mẹ như là một phần của việc thực hiện chúng. – JohannesD

+1

@JohannesD: Tôi biết rằng, xem bình luận của tôi về câu trả lời của Michal, nhưng '= default' về cơ bản là' {} 'trong lớp (nếu bạn không có thành viên). – Xeo

Trả lời

39

Để xác định phương thức ảo thuần túy, bạn cần định nghĩa riêng từ khai báo.

Do đó:

struct X { 
    virtual ~X() = 0; 
}; 

X::~X() = default; 
+0

Đây là [liên kết đến một ví dụ về Ideaone] (http://ideone.com/Y4iPA) để biên dịch thành công. –

+0

darn, bạn đánh bại tôi với nó trong khi tôi đã nhận được bản sao của C++ hiệu quả (nơi điều này được hiển thị bằng cách sử dụng cú pháp cũ) –

+3

Câu trả lời này là không chính xác! Bạn vẫn cần phải đặt dòng 'X :: ~ X() = mặc định; 'vào tệp .cpp, nếu không sẽ có lỗi liên kết' nhiều định nghĩa'. –

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