仮想デストラクタを持たないクラスから継承すべきではないと私は常に聞いてきました。このルールは多態性を使用したくない場合でも適用されますが、すべてのクラス機能が必要なだけで、さらにいくつか追加したいのですか?具体的には、以下のクラスは、ポリモーフィックに使用しない限り、明確な振る舞いで安全ですか? (派生オブジェクトに、すなわち無消去ベースポインタ)仮想デストラクタを持たないクラスから継承する
template<typename T>
class SomewhatSafeVector : public std::vector<T>
{
public:
typedef std::vector<T> base;
T& operator[](unsigned n) {
if (n >= base::size())
{
throw IndexOutOfBounds();
}
return base::operator[](n);
}
};
大丈夫かどうかは気にしないでくださいが、標準ライブラリのコンテナから派生するべきではありません。さらに、境界内で動的コンテナにアクセスする際に問題がある場合は、大規模なアルゴリズムによる思考(「0-1-多数」および「範囲」と考える)を検討することをお勧めします。通常は論理*エラーです。 –
あなたの特定の例では、継承はインターフェイスの再利用のための継承であり、実装の再利用ではないので、継承は非常に洗練されたソリューションではないと思います。 'operator []'は 'std :: vector'以外の例外をスローするので、インタフェースを再利用することはできません。コードを再利用するには、単純な共有関数を使用するか(この場合)、 'std :: vector'を' SomewhatSafeVector'のメンバにしてください。 –
@KerrekSB:最初に、どうしてですか?第二に、私はそのようなトラブルを持っていません。しかし、私は境界をチェックコンテナは、教育やデバッグの目的のための良い考えだと思う。 –