ポインタの使い方がよくわかっていないようですね。
コード:
std::vector<test*> vec;
Ally ally;
ally.set(1);
vec.push_back(&ally);
ally.set(2);
vec.push_back(&ally);
このコードはAllyクラスの実体(オブジェクト)はallly一つでありそのポインタをベクタに二つ格納している。
そのポインタが指すオブジェクトはローカルに宣言されたallyであり、その値(a)は2になっている。
仮想関数func()の呼び出しでは[0],[1]どちらもallyの関数を呼び出すので"ally2ally2"と表示される。
> このような形と教えていただいた形ではどちらのほうがいいのでしょうか?
やりたいのは複数のオブジェクトを管理したいのであろうから、ローカル変数を使いまわすのではなく、
newを使ってオブジェクトを生成するのが正しい。
失敗が表示されるコードはベクタの要素をtest型(*がついていない!)としているため、Ally型のオブジェクトを
格納してもtestの関数が呼び出されてしまうため。
> test型とAlly型は例え継承関係にあっても型は違うはず、、、。
> よって代入はできないのではないしょうか!?
私もそう思ったんだけど、VC++2015では警告すら出ない!