Không, bạn không bao giờ gọi lớp destructor bese, nó luôn luôn được gọi là tự động như những người khác đã chỉ ra nhưng đây là bằng chứng của khái niệm với kết quả:
class base {
public:
base()
{
cout << __FUNCTION__ << endl;
}
~base()
{
cout << __FUNCTION__ << endl;
}
};
class derived : public base {
public:
derived()
{
cout << __FUNCTION__ << endl;
}
~derived()
{
cout << __FUNCTION__ << endl;
} // adding call to base::~base() here results in double call to base destructor
};
int main()
{
cout << "case 1, declared as local variable on stack" << endl << endl;
{
derived d1;
}
cout << endl << endl;
cout << "case 2, created using new, assigned to derive class" << endl << endl;
derived * d2 = new derived;
delete d2;
cout << endl << endl;
cout << "case 3, created with new, assigned to base class" << endl << endl;
base * d3 = new derived;
delete d3;
cout << endl;
return 0;
}
Đầu ra là:
case 1, declared as local variable on stack
base::base
derived::derived
derived::~derived
base::~base
case 2, created using new, assigned to derive class
base::base
derived::derived
derived::~derived
base::~base
case 3, created with new, assigned to base class
base::base
derived::derived
base::~base
Press any key to continue . . .
Nếu bạn đặt trình phá hủy lớp cơ sở là ảo mà người dùng nên, thì kết quả giống như trường hợp 1 & 2.
Còn về destructor ảo thuần túy thì sao? Trình liên kết của tôi đang cố gắng gọi nó ở phần cuối của hàm hủy không ảo của lớp thừa kế của tôi; – cjcurrie
bạn không thể có một destructor ảo tinh khiết mà không có một cơ thể. Chỉ cần cho nó một cơ thể trống rỗng. Với một phương pháp ảo thuần túy thông thường, hàm ghi đè được gọi thay vào đó, với các hàm hủy, tất cả chúng đều được gọi, vì vậy bạn phải cung cấp một cơ thể. Các = 0 chỉ có nghĩa là nó phải được ghi đè, do đó, vẫn còn một cấu trúc hữu ích nếu bạn cần nó. –
Câu hỏi này có thể liên quan và giúp [câu hỏi/15265106/c-a-missing-vtable-error] (http://stackoverflow.com/questions/15265106/c-a-missing-vtable-error). –