$11.2/4州-
N の基本クラス B は、R でアクセス可能です。
- B の発明されたパブリック メンバーは、N のパブリック メンバーになるか、または
- R がクラス N のメンバーまたはフレンドで発生し、B の発明されたパブリック メンバーが N のプライベートまたは保護されたメンバーになる、または
- R は、N から派生したクラス P のメンバーまたはフレンドで発生し、B の発明されたパブリック メンバーは、P のプライベートまたは保護されたメンバーになります。
- B が R でアクセス可能な S の基本クラスであり、S が R でアクセス可能な N の基本クラスであるようなクラス S が存在します。」
ここで、「B」は「ベース」、「N」は「派生」、「R」はメインです。
2 番目の箇条書きを考えてみましょう。「R は、クラス N のメンバーまたはフレンドで発生します...」。「R」(メイン) は「N」(派生) のメンバーでもフレンドでもないため、この条項は適用されません。
3 番目の箇条書きを考えてみましょう - 「R は、クラス P のメンバーまたはフレンドで発生します....」。この条項は、上記と同じ理由で適用されません
4 番目の箇条書きを検討してください。繰り返しますが、この条項は適用されません。
したがって、「Base」は「Derived」のアクセス可能なクラスではないと結論付けることができます。
$11.2/5 州 -
基底クラスにアクセスできる場合、派生クラスへのポインターをその基底クラスへのポインターに暗黙的に変換できます (4.10、4.11)。[ 注: クラス X のメンバーとフレンドは、暗黙的に X* を X のプライベートまたは保護された即時基底クラスへのポインターに変換できるということになります。
は でアクセスするときにBase
のアクセス可能なクラスではないため、派生クラスから基底クラスへの標準変換は不適切です。したがって、エラー。Derived
main
編集2:
いくつかの一般的なコンパイラのエラー メッセージを調べて、理解を深めてください。「アクセスできません」という単語が、すべてのエラー メッセージで非常に頻繁かつ一貫して表示されることに注意してください。
参照はドラフト標準 N3000 からのものです。私はまだ最新のドラフトをダウンロードしていません:)
GCC prog.cpp: 関数 'int main()' 内: prog.cpp:27: エラー: 'ベース' は '派生' のアクセスできないベースです</p>
Comeau Online "ComeauTest.c"、26 行目: エラー: アクセスできない基本クラス "base" への変換は許可されていません ptr = 新しい派生;
VS2010 エラー C2243:「型キャスト」:「派生 *」から「ベース *」への変換は存在しますが、アクセスできません