2015-07-01 34 views
5

Tôi có một chương trình đơn giản:Tại sao destructor của lớp dẫn xuất được gọi là?

struct B 
{ 
    virtual ~B() {} 
}; 

struct D : public B 
{ 
    ~D() {} 
}; 

Vì vậy, khi tôi gọi

B* b = new D; 

b->~B(); 

tại sao destructor của lớp được thừa kế được gọi là? Đó là ảo nhưng chúng ta gọi là destructor theo tên, hoặc là có một tên ẩn của destructor đó là như nhau cho tất cả các lớp học?

Trả lời

11

Trình hủy không có tên, mỗi lần truy cập. Đối với một lớp C, cú pháp ~C được sử dụng để tham chiếu đến trình đơn hủy không tên, duy nhất.

Trong trường hợp của bạn, ~B do đó có nghĩa đơn giản là "trình phá hủy". Bởi vì đó là công văn ảo, động sẽ xảy ra khi thời gian chạy tại hàm hủy của D được gọi.

Nếu bạn đã làm điều này thay vì:

b->B::~B(); 

nó sẽ vô hiệu hóa công văn năng động (như bất kỳ cuộc gọi có trình độ khác thực hiện) và bạn muốn gọi B 's destructor chỉ.

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