ObjectSquare [2009 年 8 月号]

[技術講座]


コラム1. shared_ptrとポリモーフィズム


株式会社 オージス総研
組み込みソリューション部
近藤 貴俊

Downloaderの例では、Downloaderの操作downloadがDownloadObjectのポインタを受ける形になっていました。もし、これがshaerd_ptrにできたら、問題は解決するのでしょうか?より一般的に、以下のモデルで考えてみましょう。

shared_ptrとポリモーフィズム(クラス図)

クラスBaseHolderが、クラスBaseの集合をshared_ptr<Base>として持つという構造です。クライアントはクラスDerivedを生成し、それをshared_ptr<Drived>にて保持し、BaseHolderのaddElementに渡します。shared_ptrは継承関係を考慮した受け渡しがサポートされているため、shared_ptr<Drived>をshared_ptr<Base>に渡すと、通常のポインタを渡したように、以降、shared_ptr<Base>経由で、クラスDerivedのメンバ関数をポリモーフィックに呼び出すことができるようになります。

と、ここまでは良いのですが、これからが問題です。クラスBaseHodlerがshared_ptr<Base>経由で、メンバ関数method()を呼び出すと、期待通りクラスDerivedのmethod()が呼び出されます。しかし、この中でアクセスできるthisポインタは、Derivedの通常のポインタであり、Derivedのshared_ptrではありません。よって、クラスDerivedの操作内部から、自身をいずれかのクラスと共有したい場合は、shared_ptrを作り出す仕組みを準備しておく必要があるのです。

記事に戻る
© 2009 OGIS-RI Co., Ltd.
Index
Index