ノット さんが書きました:>
コード:
std::ofstream writing_file;
writing_file.open("test.csv", std::ios::out);
for(auto a : array){
const type_info& id = typeid(A);
writing_file << id.name() << std::endl;
}
typeid(A) は、typeid(a) の間違いですね。
typeid(A) だと、id.name() は class A になるはずです。
typeid(a) だと、id.name() が class std::shared_ptr<class A> になるのは当然。
std::vector<std::shared_ptr<A>> array; と宣言しているのですから、
array の要素である a の型は std::shared_ptr<A> です。
ノット さんが書きました:>これで配列の各要素ごとに派生クラスの型の変数が格納されると考えていたのですが、
配列の各要素ごとに「派生クラスの型の変数へのポインタの値」が格納されます。
でも格納先の配列要素の型は、あくまでも「基底クラスの型の変数へのポインタ」です。
基底クラスへのポインタでありながら、
そのポインタの指すものは「派生クラスのインスタンス」です。
だから、Init() で初期化した content.num を持っています。
ただ、A へのポインタで content.num にアクセスすることはできません。
そこで、私の書いたコードのように、virtual void Print(); が必要なのです。