多態とstlのコンテナについてこんにちはゲストさん。多態とstlのコンテナについて以下のように、継承関係を作ります。したところでコンパイルエラーになりました。これは、こういうものなのでしょうか?むしろ、struct(もしくはclass)の書き方を変えたりすれば、問題なくなったりするのでしょうか?全体としては、C++は参照などあって、どいう場合にポインタ使うべきなのかそういう部分に混乱しているような気もします。質問してしまって、申し分けないですがなにかひとつでも答えられるものがあれば回答してもらえるとありがたいです。これは、こういうものなのでしょうか?そういうものです。vector<Base>で格納しようとすると、Baseのインスタンスを作ろうとするのでコンパイルに失敗します。「スライシング」と呼ばれる問題を引き起こします。「STLコンテナにはstd::auto_ptrは使えない」仕様です。例外はあるものの、多くの場合boost::shared_ptrのような「スマートポインタ」を使うとすっきりします。vector<Base>で格納しようとすると、Baseのインスタンスを作ろうとするのでコンパイルに失敗します。vector<Base>を作ろうとしたときでなく、格納しようとした時点でインスタンスを作るのですか。純粋仮想関数など使っている様子だったので、なにか問題があるのかと思っていたのですが、そういう問題があるのですね。非常に参考になりました。「STLコンテナにはstd::auto_ptrは使えない」仕様です。例外はあるものの、多くの場合boost::shared_ptrのような「スマートポインタ」を使うとすっきりします。いうものがあるのですね。意味あるのかな?と思ってたのですが。shared_ptrというのを使えばいいのですね。(あい変らずauto_ptrの存在意義は分からないのですが)でも、shared_ptrも大きいか小さいか分かりませんが、コストがあるようなのでよく考えて、使うべきところで使うようにしたい思います。ありがとうございました。確かに「宣言」だけでの警告は難しいでしょう。宣言だけならエラーとは言えないはず。01:24:50お礼やっぱりSTLによって違うんですね。調べていただいてありがとうございます。それとも「ポインタや参照」で使うかということで明確に区別する必要があります.ANo.1のスライシングの問題ですね。(昨日覚えた事なので自信ないですが。)半端にコピーされること自体は多分問題ないけど、Yのメンバ関数で、XにないY独自の領域にアクセスしようとすると困るので多分そうなっているんだろうと考えています。やってみましたが、コンストラクタは動いていない様子でした。listの方は、番兵かなにか作っていてそいういう部分で困るのかもしれないですね。STLのソースは良く分かりませんでした。)ありがとうございました。休出とかするものじゃない...今日はメタメタです。vector<Base>を作る時点/格納の時点ということで言えば、作る時点でエラーになります。コピーコンストラクタではないかと思ったのですが、これも違いますか?ごめんなさい。できないなら、宣言の時点でエラーにしてくれた方が親切です。使っているということなんでしょうね。ありがというございました。(0)通報するANo.4jactaこの手の問題をクリアするには、既に回答が出ているように、boost::shared_ptrあるいはstd::tr1::shared_ptr(可能であれば後者の方が望ましいかも)を使うのが正攻法だと思います。shared_ptrを使えば、仮想デストラクタがなくても、うまく解体できるようになりますし、いろいろメリットがあります。サイズ効率がどうしても気になるのであれば、boost::ptr_vectorという選択肢もあるにはあります。使い勝手がいまいちなので、どちらかといえば、それほどお勧めはしませんが...。shared_ptrを使えば、仮想デストラクタがなくても、うまく解体できるようになりますし、いろいろメリットがあります。この、shared_ptrは今日知ってリファレンスカウントをもっているというのが分かったのですが、それ以外にも機能があるのですね。ないデストラクタしかなくても、よきにはからってくれるようでした。実装方法は全く検討もつきませんが、凄いことは分かりました。ありがとうございました。22:15:33お礼やっぱり、コピーコンストラクタが必要なのですか。あるような予期せずスーパークラスの関数が呼ばれてしまう、ということでしょうか?僕が調べたところ、スーパークラスの関数が呼ばれる場合は直接スーパークラスの関数が呼ばれていて、ポインタ経由でうまくいっている場合は仮想関数テーブル経由になっているみたいでした。格納しようとした時点でインスタンスを作るのですか。