C では静的関数を非静的関数でオーバーロードすることはできません
多くのプログラミング言語では、静的メソッドまたはインスタンス メソッドに基づいた関数のオーバーロードが許可されています, C ではこの動作を明示的に禁止しています。 C 標準 13.1/2 では、同じ名前とパラメーター型を持つメンバー関数は、いずれかが静的である場合はオーバーロードできないと規定されています。
<code class="cpp">class X { static void f(); void f(); };</code>
上の例では、f() の 2 つの宣言が考慮されています。標準では不正な形式です。
インスタンスで静的関数を呼び出す際のあいまいさ
このシナリオで関数のオーバーロードが許可されていたとしても、関数を呼び出すときはあいまいさが残ります。インスタンスの静的関数。 C 標準 9.4/2 では、修飾 ID (X::f() など) とクラス メンバー アクセス構文 (g().reschedule() など) の両方を使用して静的メンバーを呼び出すことが許可されています。したがって、次のコードでは、静的 print() 関数と非静的 print() 関数のどちらを呼び出す必要があるかが不明瞭です:
<code class="cpp">class Foo { void print() { cout << "nonstatic" << endl; } static void print() { cout << "static" << endl; } }; Foo f; f.print(); // Ambiguous: static or non-static?</code>
関数が静的に呼び出されているかどうかを確認する
this 変数が定義されているかどうかをチェックして関数が静的に呼び出されるかどうかを判断できる PHP とは異なり、C にはこの機能がありません。 this キーワードは常にオブジェクトを指し、NULL になることはないため、静的呼び出しとインスタンス呼び出しを区別するために使用することはできません。
以上がC では静的関数を非静的関数でオーバーロードできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。