デストラクタについて確認したいのですが

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

デストラクタについて確認したいのですが

#1

投稿記事 by dic » 16年前

以下のようなコードがありますが
基本クラスでデストラクタを宣言、実装してない場合
それを派生したクラスをdeleteするとき、デクトラクタが呼ばれませんが
これはこれで 正しかったのでしょうか?
#include	<stdio.h>

class	CBase
{
public:
	virtual	void	Show();
};

void	CBase::Show()
{
	printf( "CBase::Show.\n" );
}

class	CDev	:	public	CBase
{
public:
	CDev();
	~CDev();
	void	Show();
};

CDev::CDev()
{
	printf( "CDev construct.\n" );
}
CDev::~CDev()
{
	printf( "CDev destruct.\n" );
}
void	CDev::Show()
{
	printf( "CDev::Show.\n" );
}

void	main()
{
	CBase	*obj = new CDev;

	obj->Show();

	delete obj;
}

たかぎ

Re:デストラクタについて確認したいのですが

#2

投稿記事 by たかぎ » 16年前

改善点は少なくとも二つあります。

1. CBaseクラスに仮想デストラクタがない。
2. mainの返却値型がvoidなので、未定義の動作を引き起こしている。

ねこ

Re:デストラクタについて確認したいのですが

#3

投稿記事 by ねこ » 16年前

意図が分かりませんが、ソース上では正しい動作です。

CBaseのポインタでインスタンスを受け取っているのでdeleteすれば当然CBaseのデストラクタが実行されます。
CDevクラスのデストラクタを実行したいのであれば以下のようにします。

1.たかぎさんの1番にあるようにCBaseのデストラクタにはvirtual定義を付ける
2.delete (CDev*)(obj);というようにキャストしてからdeleteを実行する

dic

Re:デストラクタについて確認したいのですが

#4

投稿記事 by dic » 16年前

なるほど
表現を変えると基本クラスで仮想デストラクタがない場合の動作としては正しいか?
と言った方がよかったかもしれません

回答ありがとうございました

YuO

Re:デストラクタについて確認したいのですが

#5

投稿記事 by YuO » 16年前

解決となっていますが,
> 基本クラスで仮想デストラクタがない場合の動作としては正しいか?
その場合,未定義の振る舞いとなります。
なので,根本的に「正しい動作」の定義が存在しません。

閉鎖

“C言語何でも質問掲示板” へ戻る