はい、ラッピングは継承よりも優れていますが、既存のデータ構造に状態を追加する必要がある場合に限ります。それ以外の場合は、非メンバー関数を追加します。これについては、C ++コーディング標準( Amazon)の項目35で詳しく説明されています。
状態を追加するには、継承ではなく構成を優先します。確かに、保持したいメンバー関数のパススルー関数を作成するのは面倒ですが、そのような実装は、パブリックまたは非パブリックの継承を使用するよりもはるかに優れており、安全です。
template<typename T>
class MyExtendedVector
{
public:
// pass-through functions for std::vector members
void some_existing_fun() { return vec_.some_existing_fun(); }
// new functionality that uses extra state
void some_new_fun() { // your implementation here }
private:
std::vector<T> vec_;
// extra state e.g. to do logging, caching, or whatever
};
動作を追加するには、メンバー関数ではなく非メンバー関数を追加することをお勧めします。
ただし、アルゴリズムをできるだけ一般的にするようにしてください。
// if you CAN: write algorithm that uses iterators only
// (and delegates to iterator category that container supports)
template<typename Iterator, typename T>
bool generic_contains(Iterator first, Iterator last, T const& elem)
{
// implement using iterators + STL algorithms only
return std::find(first, last, elem) != last;
}
// if you MUST: write algorithm that uses specific interface of container
template<typename T>
void vector_contains(std::vector<T> const& v, T const& elem)
{
// implement using public interface of Container + STL algorithms
return generic_contains(v.begin(), v.end(), elem);
}