1. ホーム
  2. c++

[解決済み] 派生クラスで同じ名前で異なるシグネチャを持つ関数

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) の仮想関数機構も同時に無効になることに注意してください。