Có sai không khi viết:
class A {
public:
virtual ~A() = 0;
};
cho một lớp cơ sở trừu tượng?
Ít nhất là nó biên dịch trong MSVC ... Nó có bị sập khi chạy không?
Có sai không khi viết:
class A {
public:
virtual ~A() = 0;
};
cho một lớp cơ sở trừu tượng?
Ít nhất là nó biên dịch trong MSVC ... Nó có bị sập khi chạy không?
Câu trả lời:
Đúng. Bạn cũng cần thực hiện hàm hủy:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
nên đủ.
Và vì điều này đã bỏ phiếu, tôi nên làm rõ: Nếu bạn lấy được bất cứ thứ gì từ A và sau đó cố gắng xóa hoặc phá hủy nó, thì A
kẻ hủy diệt cuối cùng sẽ được gọi. Vì nó là thuần túy và không có triển khai, 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ý purecall và sự cố.
Chỉnh sửa: sửa lỗi khai báo để phù hợp hơn, được biên dịch với http://www.comeaucomputing.com/tryitout/
Các hàm hủy riêng tư: chúng sẽ báo lỗi cho bạn khi bạn tạo một đối tượng của lớp dẫn xuất - không phải khác. Một chẩn đoán có thể xuất hiện mặc dù.
12.4 Phá hủy
6 Một hàm hủy có thể được khai báo là ảo (10.3) hoặc ảo thuần (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 trong chương trình, hàm hủy sẽ được xác định.
Một lớp với một hàm hủy ảo thuần túy là một lớp trừu tượng. Tôi sẽ lưu ý:
10,4 lớp trừu tượng
2 Chỉ cần xác định một hàm ảo thuần túy nếu được gọi bằng hoặc như với (12.4), cú pháp id đủ điều kiện (5.1).
[ Lưu ý : một khai báo hàm không thể cung cấp cả hàm xác định thuần túy và ghi chú Định nghĩa]
Lấy thẳng từ dự thảo:
struct C {
virtual void f() = 0 { }; // ill-formed
};