Nó không. Đây là gần một bằng chứng cho thấy các destructor không tự động làm ảo: Hành vi
#include <iostream>
struct BaseBase {
~BaseBase() {
std::cout << "~BaseBase\n";
}
};
struct Base : BaseBase
{
virtual void foo() = 0;
//~Base(); <-- No destructor!
};
struct Derived : Base {
void foo() { std::cout << "foo\n"; }
~Derived() {
std::cout << "~Derived\n";
}
};
int main() {
Base *p = new Derived();
delete p;
}
Chương trình này thực sự đã không xác định, nhưng tôi mạnh nghi ngờ rằng tình hình thực hiện của bạn nó không in "~ Xuất phát". Nếu Base
có một destructor ảo, sau đó nó sẽ không có hành vi không xác định, và nó sẽ in "~ Derived".
Tất nhiên nó không thực sự chứng minh bất cứ điều gì về tiêu chuẩn. Bất kỳ triển khai nào bạn chạy nó có thể sau khi tất cả đều không phù hợp. Nhưng một khi bạn đã thử nó trên một vài, bạn sẽ nhận được ý tưởng rằng bất cứ điều gì tiêu chuẩn có thể nói, bạn cần phải xác định một destructor ảo.
Nguồn
2011-08-12 15:01:23
No. Nhưng tôi không thể cung cấp cho bạn một tài liệu tham khảo cho một cái gì đó tiêu chuẩn * không * nói ... –
Nếu chỉ trình biên dịch có thể trả lời câu hỏi trên stackoverflow;) – MerickOWA