質問

C#のシールドキーワードを読んでいました。最後に標準ライブラリから継承したことを思い出せません。 C ++では、いくつかの型をtypedefし、いくつかのパラメーターを使用したstdインターフェイスを継承したことを覚えています。しかし、それは1)些細な2)インターフェース

頭の上から、継承されることを期待する仮想関数を持たない、継承したクラスを覚えていません。インターフェースではない自明ではないクラスを継承する必要がある状況について、誰か教えてもらえますか?

クラスに仮想関数がない限り、クラスを継承しないことをお勧めします。これは経験則ですか?

注:演算子SomeClass&を使用しますSomeClass(){m_someClassを返す; }私のオブジェクトを別のクラスとして渡す必要がある場合。うまくいきます。

役に立ちましたか?

解決

実際には、これらのすべてではない種類の継承(たとえば、実装の継承、mixin、boost :: noncopyable、これを継承し、クラスをコピー不可、boost :: operatorsにするため)でC ++で使用されますクラスから継承すると、クラスに演算子が追加されます)。また、C ++型でメタプログラミングを行う場合、別の型から継承することは、型を構成する最も簡単な方法の1つです。

仮想関数を持たないが「種類」として機能するクラスから継承する別のケース。インターフェースは静的多相性です(クラスConcreteA:BaseAのCRTPなどの手法)。コンパイル時にすべてが解決されるため、仮想関数は必要ありません。

ただし、クラスを実行時多態的に処理する場合は、少なくとも1つのメソッドを仮想化する必要があります。これがデストラクタになります。例外はありますが、まれです。

ポリモーフィックな階層がある場合でも、具体的なクラスから派生することがあります。 1つの例は、TextEditから派生したSingleLineEditです。ただし、これは少し危険です。親クラスのカプセル化を壊すためです(たとえば、メソッドは実装の詳細を予期し、サブクラスでそれらを尊重し、保持する必要があります。次のバージョンなどで予告なしに変更する)

他のヒント

オブジェクト指向プログラミングの重要な概念は多態性だと主張します。特定のクラスから継承してもポリモーフィズムを利用できない場合、継承のポイントは何ですか?したがって、オーバーライドするメソッドがない場合は、サブクラス化しないでください。コードの複雑さを増やすだけです。多くの同じ機能が必要な場合は、既存のクラスを独自にラップするだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top