[解決済み] 派生クラスで同じ名前で異なるシグネチャを持つ関数
2023-02-13 20:59:07
質問
基底クラスと派生クラスで、同じ名前で異なるシグネチャを持つ関数があります。派生クラスを継承する別のクラスでベースクラスの関数を使用しようとすると、エラーが発生します。以下のコードを見てください。
class A
{
public:
void foo(string s){};
};
class B : public A
{
public:
int foo(int i){};
};
class C : public B
{
public:
void bar()
{
string s;
foo(s);
}
};
gccコンパイラから以下のようなエラーが出ます。
In member function `void C::bar()': no matching function for call to `C::foo(std::string&)' candidates are: int B::foo(int)
もし私が
int foo(int i){};
というクラスから
B
から、または名前を変更すると
foo1
に変更すれば、すべてうまくいきます。
これのどこが問題なのでしょうか?
どのように解決するのですか?
基底クラスの関数をオーバーライドしていない派生クラスの関数で、同じ名前を持つものは を隠します。 を隠します。
ベースクラスの関数をオーバーライドすることを意図していないベースクラスの関数と同じ名前を持つ派生クラスの関数を持つことは、一般的にバッドプラクティスであると考えられており、あなたが見ているものは通常望ましい動作ではありません。通常、異なる関数には異なる名前を付けることが望ましいとされています。
基底関数を呼び出す必要がある場合、その呼び出しをスコープするために
A::foo(s)
. の仮想関数機構も無効になることに注意してください。
A::foo(string)
の仮想関数機構も同時に無効になることに注意してください。
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] C++の継承 - アクセス不能なベース?
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
-
[解決済み] 関数名を文字列として取得するには?
-
[解決済み] 派生クラス関数から親クラス関数を呼び出すには?
-
[解決済み】静的定数文字列(クラスメンバ)
-
[解決済み】vtableへの未定義の参照
-
[解決済み】派生クラスでオーバーライドされた関数が、ベースクラスの他のオーバーロードを隠してしまうのはなぜですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】Enterキーを押して続行する
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された