9-Laboratory

090630小言。

29.06.2009 (9:02 pm) – Filed under: temp ::

C++を触れない状態なのに、「C++FAQ」を読み直していた。
仮想関数のポリモフィックさが同じに保たれない場合があるみたい。

/**/
class Base
{
public:
	virtual ~Base()
	{
		puts("~Base()");
		Func();/*これは何を呼ぶ?*/
	}
	virtual void	Func()
	{
		puts("Base::Func()");
	}
};
/**/
class Deri1 : public Base
{
public:
	virtual ~Deri1()
	{
		puts("~Deri1()");
		Func();/*これは何を呼ぶ?*/
	}
	virtual void	Func()
	{
		puts("Deri1::Func()");
	}
};
/**/
class Deri2 : public Deri1
{
public:
	virtual ~Deri2()
	{
		puts("~Deri2()");
		Func();/*これは何を呼ぶ?*/
	}
	virtual void	Func()
	{
		puts("Deri2::Func()");
	}
};
/**/
int main()
{
	Deri2 d;
	d.Func();/*これは間違いなくDeri2::Func()を呼ぶ*/
	puts("start destruct");
}

子のデストラクタが呼ばれた時点で、その子は仮想関数のリストから削除されているという事らしい。
そりゃあ、子が消えた状態で子を呼べてしまったら不味いですね。
#別にこんなことは知らなくても良さそうではありますが。