C++ 派生クラスのデストラクター

派生クラスのデストラクターの機能は、このクラスのオブジェクトが消滅する前に必要なクリーニング作業を実行することです。デストラクターには型もパラメーターもありません。

派生処理では基底クラスのデストラクタを継承することができないため、デストラクタが必要な場合は派生クラス内で新たなデストラクタを宣言する必要があります。派生クラスのデストラクターの宣言メソッドは、関数本体が派生クラスの新しく追加された非オブジェクト メンバーをクリーンアップする責任がある限り、継承関係にデストラクターがない場合のデストラクターの宣言メソッドとまったく同じです。システムは、基本クラスとオブジェクト メンバーのデストラクターを呼び出して、基本クラスとオブジェクト メンバーをクリーンアップします。ただし、実行順序はコンストラクタとは逆で、最初にデストラクタの関数本体を実行し、次に派生クラスの新しく追加されたクラス型のメンバー オブジェクトをクリーンアップし、最後にベースから継承したすべてのメンバーをクリーンアップします。クラス。これらのクリーニング タスクは、派生クラス デストラクターを実行し、クラス型の派生クラス オブジェクト メンバーが配置されているクラスのデストラクターを呼び出し、基本クラスのデストラクターを呼び出します。これらのデストラクターが呼び出される順序は、コンストラクターが呼び出される順序とはまったく逆です。

特定のクラスのデストラクターが明示的に宣言されていない場合、コンパイル システムは各クラスのデフォルトのデストラクターを自動的に生成し、オブジェクトの有効期間が終了するときにそれを自動的に呼び出します。自動生成されたデストラクターの関数本体は空ですが何もせず、派生クラスのオブジェクトメンバーが配置されているクラスのデストラクターを暗黙的に呼び出し、基底クラスのデストラクターを呼び出します。

【例】派生クラスデストラクタの例

class B1//基类B1,构造函数有参数
{
    
    
public:

	B1(int i)
	{
    
    
		cout << "基类B1的构造函数" << i << endl;
	}
	~B1()
	{
    
    
		cout << "基类B1的析构函数" << endl;
	}

};

class B2//基类B2,构造函数有参数
{
    
    
public:
	B2(int j)
	{
    
    
		cout << "基类B2的构造函数" << j << endl;
	}
	~B2()
	{
    
    
		cout << "基类B2的析构函数" << endl;
	}

};

class B3//基类B3,构造函数无参数
{
    
    
public:
	B3()
	{
    
    
		cout << "基类B3的构造函数" << endl;
	}
	~B3()
	{
    
    
		cout << "基类B3的析构函数" << endl;
	}
};

class D :public B2, public B1, public B3//派生类D,注意基类名的顺序
{
    
    
public://派生类的公有成员
	D(int a, int b, int c, int d) : b2(d), B2(b), B1(a), b1(c) {
    
    }//注意类名的个数与顺序,注意成员对象名的个数与顺序
private://派生类的私有成员对象
	B1 b1;
	B2 b2;
	B3 b3;
};

int main()
{
    
    
	D d(1, 2, 3, 4);
	return 0;
}

操作結果:
ここに画像の説明を挿入

分析します:

プログラムでは、デストラクターが 3 つの基本クラスに追加されますが、派生クラスには変更が加えられず、システムによって提供されるデフォルトのデストラクターが引き続き使用されます。プログラムが実行されると、最初に派生クラスのコンストラクターが実行され、次に派生クラスのデストラクターが実行されます。派生クラスのデフォルトのデストラクターは、メンバー オブジェクトと基本クラスのデストラクターをそれぞれ呼び出します。その順序はコンストラクターの順序とまったく逆になります。

【例2】

class B
{
    
    
public:
	B(int x = 0) :x(x)
	{
    
    
		cout << "基类B构造函数" << endl;
	}
	B(B& b)
	{
    
    
		cout << "基类B的拷贝构造函数" << endl;
		x = b.x;
	}
	~B()
	{
    
    
		cout << "基类B的析构函数" << endl;
	}
	void show1()
	{
    
    
		cout << "x的值为:" << x << endl;
	}
	int getX()
	{
    
    
		return x;
	}
private:
	int x;
};

class D :public B
{
    
    
public:
	D(int a, int b, int c, int d) :B(a), y(b), z(c), v(d)
	{
    
    
		cout << "派生类D的构造函数" << endl;
	}
	D(D& dd) :B(dd)
	{
    
    
		cout << "派生类D的拷贝构造函数" << endl;
		x = dd.x;
		y = dd.y;
		z = dd.z;
		v = dd.v;
	}

	~D()
	{
    
    
		cout << "基类D的析构函数" << endl;
	}

	void show2()
	{
    
    
		cout << "x的值为:" << getX() << endl;
		cout << "y的值为:" << y << endl;
		cout << "z的值为:" << z << endl;
		cout << "v的值为:" << v << endl;
	}
private:
	int x;
	int y;
	int z;
	int v;
};

int main()
{
    
    
	B b(5);
	b.show1();

	D d(1, 2, 3, 4);
	d.show2();

	D dd(d);
	dd.show2();
	return 0;
}

操作結果:
ここに画像の説明を挿入

Supongo que te gusta

Origin blog.csdn.net/NuYoaH502329/article/details/132133916
Recomendado
Clasificación