Tại sao tôi cần một destructor ảo?

Destructor ảo là một thực thể thiết yếu nếu bạn sử dụng thừa kế. Destructor ảo được khai báo trong một lớp cơ sở. Nó đảm bảo rằng đối với tất cả các lớp có nguồn gốc từ lớp cơ sở tất cả các destructors: 1) sẽ được gọi và 2) sẽ được gọi theo thứ tự đúng. Nó tạo ra một hành vi đa hình. Hãy xem đoạn trích dưới đây:

#include "stdio.h"

lớp BaseClass
{
	int id;
công cộng:
	BaseClass () {printf ("BaseClass () \ n"); }
	ảo ~ BaseClass () {printf ("~ BaseClass () \ n"); } // !!!
};

lớp Class1: public BaseClass
{
	int id;
công cộng:
	Class1 () {printf ("Class1 () \ n"); }
	~ Class1 () {printf ("~ Class1 () \ n"); }
};

lớp Class2: public Class1
{
	int id;
công cộng:
	Class2 () {printf ("Class2 () \ n"); }
	~ Class2 () {printf ("~ Class2 () \ n"); }
};


int main (int argc, char * argv [])
{
	BaseClass * p = new Class2;
	xóa p;

	trở lại 0;
}

Đầu ra trong trường hợp không có destructor ảo là:

BaseClass ()
Class1 ()
Lớp 2 ()
~ BaseClass ()

Nhưng đầu ra trong trường hợp với destructor ảo khác:

BaseClass ()
Class1 ()
Lớp 2 ()
~ Lớp 2 ()
~ Lớp 1 ()
~ BaseClass ()

Bây giờ bạn thấy những gì sẽ xảy ra nếu destructor nên gọi delete()cho một số đối tượng / mảng được sử dụng trong lớp học? Tiếp tục: sử dụng destructor ảo để đảm bảo thanh toán bù trừ bộ nhớ chính xác trong trường hợp sử dụng thừa kế.

Leave a Reply

Your email address will not be published. Required fields are marked *