質問

それは正確に何から意味がありますか technical point of view, 、私はそれが私のことを意味することを理解しました derived class 常に変換できます base class, 、 それでおしまい?私は技術的な側面に言及することなく、いくつかの資料を読みましたが、哲学だけです!前もって感謝します

役に立ちましたか?

解決

それは私の派生クラスを常に基本クラスに変換できることを意味します

実際、それはそれよりも良いことを意味します。 int 常に変換できます float, 、しかし、それはintが「フロート」という意味ではありません。それは、フロートをintから構築できることを意味します。同様に、変換するが、他の関係はありませんが、ユーザー定義のクラスを持つことができます。

継承を使用すると、派生クラスへのポインターまたは参照を常にポインターに変換するか、基本クラスへの参照[*]に変換できます。つまり、派生クラスのオブジェクトは、基本クラスのオブジェクトの代わりに立つことができます。それは実際にはそれらの1つです。人が脳外科医に立ち向かうことができれば、彼らは脳外科医です。

「is a」がバーバラリスコフの場合の1つの正式な定義 代替原則. 。確かにこれはまだ哲学ですが、それは非常に健全な哲学であり、プログラムの作成方法に直接関係しています。

C ++で継承を使用するときにまっすぐに保つ必要があるもう1つのことは、ランタイム多型の違いです(使用して達成されます virtual 関数)および静的多型(実際には継承をまったく必要としません)。非仮想的な関数呼び出しを使用すると、コンパイラがオブジェクトが持っている(静的タイプ)と指示されるクラスで常に定義されているバージョンと呼ばれる機能のバージョンが常に定義されています。派生クラスで過負荷になっている場合、これは実際には正しく機能しない可能性があります。仮想呼び出しを使用すると、呼ばれるバージョンはクラスで定義されているバージョンです。あなたが目指している2種類の「Is a」のどれを決定することが不可欠です。

*]そして、オブジェクトはポインターから有効にアクセスできます。ポインタータイプをいつでも強制することができます reinterpret_cast, 、しかし、それは私がここで意味するものではありません。そして、いくつかの厄介な詳細があります - 基本クラスが曖昧な場合、ポインターを一度に変換することはできませんが、いくつかの明確なキャストを使用して明示的に行うことができます。基本クラスにアクセスできない場合は、 できる それを変換しますが、暗黙的にではなく、Cスタイルのキャストでのみ。 Cスタイルのキャストはaのように機能します static_cast これは、アクセシビリティを無視します reinterpret_class. 。だからあなたは働くポインターを手に入れますが、うまくいけば、あなたは非常に間違ったことをしているという強い感覚もあります;-)

他のヒント

派生クラスは、特定のポイントRでアクセス可能で明確な基本クラスのみに変換できます。参照の不足はなく、C ++標準自体以外の場所です。

$ 10.2は適切な参照です。派生クラス自体は、アクセス制御の対象となる基本クラスとして機能できます。 11.2を参照してください。派生クラスへのポインターは、アクセス可能な曖昧な基本クラス(4.10)へのポインターに暗黙的に変換できます。導出されたクラスタイプのlvalueは、アクセス可能な明確な基本クラス(8.5.3)への参照に結合できます。 - エンドノート

そしてまた

$ 10.3-「ベーススペシファーリストは、派生クラスタイプのオブジェクトに含まれるベースクラスのサブオブジェクトのタイプを指定します。クラスベースのサブオブジェクト。[...

OOAD原則に関して:

個人的にお勧めします ロバート・マーティンの記事 この特にOCPの原則を把握するために。著者がこれらの伝説的なOOADガイドラインを説明する明快さと権威を打ち負かすことはできません

@Stevesの投稿で説明されているLSPも見てください

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