「他の言語 (C++ または C#) には、これに関する異なる規則がありますか?」
C++ にはさまざまなルールがあります。静的または動的メンバー関数バインディング プロセスとアクセス権限の適用は直交しています。
メンバー関数にprivate
アクセス権限修飾子を与えるということは、この関数は宣言クラスによってのみ呼び出すことができ、他の (派生クラスでさえも) 呼び出すことはできないということを意味します。private
メンバー関数を として宣言するとvirtual
、純粋な仮想 ( virtual void foo() = 0;
) であっても、基本クラスはアクセス権限を強制しながら特殊化の恩恵を受けることができます。
メンバー関数に関してはvirtual
、アクセス権限によって、何をすべきかがわかります。
private virtual
つまり、動作を特殊化することは許可されていますが、メンバー関数の呼び出しは基本クラスによって、確実に制御された方法で行われます
protected virtual
オーバーライドするときにメンバー関数の上位クラスのバージョンを呼び出す必要がある/呼び出す必要があることを意味します
したがって、C++ では、アクセス権と仮想性は互いに独立しています。関数を静的にバインドするか動的にバインドするかを決定することは、関数呼び出しを解決する最後のステップです。
public virtual
最後に、メンバー関数よりもテンプレート メソッド デザイン パターンを優先する必要があります。
参照:会話: 事実上あなたのもの
private virtual
この記事では、メンバー関数の実用的な使用法について説明します。
ISO/IEC 14882-2003 §3.4.1
名前検索は、名前が関数名であることがわかった場合、複数の宣言を名前に関連付けることができます。宣言はオーバーロードされた関数のセットを形成すると言われています (13.1)。オーバーロードの解決 (13.3) は、名前のルックアップが成功した後に行われます。アクセス ルール (条項 11) は、名前の検索と関数のオーバーロードの解決 (該当する場合) が成功した場合にのみ考慮されます。名前のルックアップ、関数オーバーロードの解決 (該当する場合)、およびアクセス チェックが成功した後でのみ、名前の宣言によって導入された属性が、式の処理 (5 節) でさらに使用されます。
ISO/IEC 14882-2003 §5.2.2
メンバー関数呼び出しで呼び出される関数は、通常、オブジェクト式の静的タイプ (節 10) に従って選択されますが、その関数が仮想であり、修飾 ID を使用して指定されていない場合、実際に呼び出される関数は、の最終オーバーライド (10.3) になります。オブジェクト式の動的型で選択された関数 [注: 動的型は、オブジェクト式の現在の値によってポイントまたは参照されるオブジェクトの型です。