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


KL  2005-09-19 11:40:10  No: 59098  IP: 192.*.*.*

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 12:05:15  No: 59099  IP: 192.*.*.*

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

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

編集 削除
isshi  2005-09-19 12:47:08  No: 59100  IP: 192.*.*.*

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

編集 削除
isshi  2005-09-19 13:14:09  No: 59101  IP: 192.*.*.*

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

編集 削除