1

technical point of viewfromとは正確にderived classはどういう意味base classですか? 技術的な側面については言及せずに、哲学だけを読んだ資料をいくつか読みました。前もって感謝します

4

2 に答える 2

4

これは、派生クラスをいつでも基本クラスに変換できることを意味します

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

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

「is a」の場合の正式な定義の 1 つに、Barbara Liskov の置換原則があります。これは確かに哲学ですが、非常に健全な哲学であり、プログラムの書き方に直接関係しています。

C++ で継承を使用するときに明確にしておく必要があるもう 1 つのことは、実行時ポリモーフィズム (virtual関数を使用して実現) と静的ポリモーフィズム (実際には継承をまったく必要としない) の違いです。非仮想関数呼び出しでは、呼び出される関数のバージョンは常に、オブジェクトが持っているとコンパイラに通知されたクラス (静的型) で定義されたバージョンです。派生クラスでオーバーロードされている場合、これは実際には正しく機能しない可能性があります。仮想呼び出しでは、呼び出されるバージョンは、オブジェクトが実際に存在するクラス (動的型) で定義されたバージョンです。2種類の「is a」のどちらを目指すかを決めることが重要です。

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

于 2010-10-03T12:55:13.327 に答える
2

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

$10.2 は参考になります。派生クラス自体が、アクセス制御の対象となる基本クラスとして機能します。11.2を参照してください。派生クラスへのポインターは、アクセス可能な明確な基本クラス (4.10) へのポインターに暗黙的に変換できます。派生クラス型の左辺値は、アクセス可能な明確な基本クラス (8.5.3) への参照にバインドできます。—終わりのメモ]

そしてまた

$10.3 - 「base-specifier-list は、派生クラス タイプのオブジェクトに含まれる基本クラス サブオブジェクトのタイプを指定します。クラス Base のサブオブジェクト。[...]

OOAD の原則に関しては、次のとおりです。

個人的には、特に OCP の原則について理解を深めるために、Robert Martin の記事をお勧めします。これらの伝説的な OOAD ガイドラインを説明する著者の明快さと権威に勝るものはありません。

@Stevesの投稿で説明されているように、LSPも​​見てください

于 2010-10-03T12:44:02.733 に答える