[解決済み] publicなconstメソッドがprivateな時に呼び出されないのはなぜですか?
質問
このコードを考えてみましょう。
struct A
{
void foo() const
{
std::cout << "const" << std::endl;
}
private:
void foo()
{
std::cout << "non - const" << std::endl;
}
};
int main()
{
A a;
a.foo();
}
コンパイラのエラーは
error: 'void A::foo()' is private`.
しかし、privateの方を削除するとそのまま動作してしまいます。なぜconstでない方はprivateなのにpublicのconstメソッドは呼ばれないのでしょうか?
つまり、なぜアクセス制御よりもオーバーロードの解決が優先されるのでしょうか?これは不思議です。一貫性があると思いますか?私のコードは動作し、その後、私はメソッドを追加し、私の作業コードはまったくコンパイルされません。
どのように解決するのですか?
を呼び出すと
a.foo();
を呼び出すと、コンパイラはオーバーロードの解決を行い、使用するのに最適な関数を見つけます。オーバーロードのセットを構築するとき、コンパイラは
void foo() const
と
void foo()
さて、このように
a
は
const
でない場合、非構成バージョンの方が最適であるため、コンパイラは
void foo()
. そして、アクセス制限をかけると、コンパイラーエラーが発生します。
void foo()
はプライベートであるため、コンパイラエラーが発生します。
覚えておいてほしいのは、過負荷解消では「最も使える関数を探す」のではないということです。最適な関数を見つけ、それを使用しようとする」のです。アクセス制限や削除されたために使用できない場合は、コンパイラーエラーが発生します。
言い換えれば、なぜアクセス制御よりもオーバーロードの解決が先なのか?
さて、見てみましょう。
struct Base
{
void foo() { std::cout << "Base\n"; }
};
struct Derived : Base
{
void foo() { std::cout << "Derived\n"; }
};
struct Foo
{
void foo(Base * b) { b->foo(); }
private:
void foo(Derived * d) { d->foo(); }
};
int main()
{
Derived d;
Foo f;
f.foo(&d);
}
ここで、私が実際に作るつもりではなかったとしましょう。
void foo(Derived * d)
をプライベートなものにするつもりはなかったとしましょう。もしアクセス制御が優先されるなら、このプログラムはコンパイルされ、実行されて
Base
と表示されるでしょう。これは大規模なコードベースにおいて追跡するのが非常に困難です。アクセス制御がオーバーロードの解決の後に来るので、私が呼び出したい関数が呼び出されないことを伝える素晴らしいコンパイラー エラーが得られ、バグをより簡単に発見することができます。
関連
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】デバッグアサーションに失敗しました