キャストにより呼ばれる関数


KL  2005-09-19 20:40:10  No: 59098

class A{  
public:
void Loop(){}
}

class B : public A{  
public:
    void Loop(){
        exit();
}
}

のようにA,Bを用意して、

vector<A> Vec;
B testB;
Vec.push_back( testB );
Vec[0].Loop();

としたときに、Vec[0].Loop() では、Vec[0]はBなのに、AのほうのLoopが呼ばれますよね?
これを、AのときはAのLoop、BのときはBのLoopが呼ばれるようにするにはどのようにすればよいのでしょうか?

宜しくお願いします。


tetrapod  2005-09-19 21:05:15  No: 59099

vector<A> ですか?本当に?
これではスライシングが起こってしまうので期待通りの動きはしませんよ。
vec[0] には testB の一部 (A 部分) だけしか入っていません。

polymophic な vector が欲しい場合は vector<A*> 等にする必要があります。
スマートポインタと併用すると吉。


isshi  2005-09-19 21:47:08  No: 59100

>polymophic な vector が欲しい場合は vector<A*> 等にする必要があります。
さらに、Loop() を virtual にする必要があります。


isshi  2005-09-19 22:14:09  No: 59101

すみません。また、追加。
さらに A のデストラクタを virtual にする必要があります。
そうしないと、
  A *a = new B;
  delete a;
としたときに、正しくデストラクトされません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加