web-dev-qa-db-ja.com

継承されたクラスでの関数のオーバーロードに関するc ++の問題

これはおそらくnoobの質問です。私は最近、c ++、関数のオーバーロード、および継承で高レベルのものをいじろうとするときに奇妙な問題に直面しました。

問題を示すために、簡単な例を示します。

以下のように、classAclassBの2つのクラスがあります。

_class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
};
_

私が知っていることによると、classBは2つのfunc(..)関数を持っているはずですが、引数が異なるためオーバーロードされています。

しかし、これをmainメソッドで試すと、

_int main(){
    int a;
    char b[20];
    classB objB;
    objB.func(a);    //this one is fine
    objB.func(b);    //here's the problem!
    return 0;
}
_

スーパークラスclassAにあるメソッドvoid func(char[]){};は、派生クラスclassBでは表示されないため、エラーが発生します。

どうすればこれを克服できますか?これはC++でのオーバーロードのしくみではありませんか?私はc ++は初めてですが、Javaでは、このようなものを利用できることを知っています。

同様の問題について尋ねる this thread はすでに見つかりましたが、2つのケースは異なると思います。

45
Sumudu

必要なのはusingだけです。

class classB:public classA{ 
    public:
        using classA::func;
        void func(int){};
};

派生クラスで既に見つかったため、funcの基本クラスを検索しません。 usingステートメントは、他のオーバーロードを同じスコープに入れ、オーバーロードの解決に参加できるようにします。

57
chris

たとえば、この質問の回答でよく説明されています。

「using」キーワードを使用して基本クラスのメソッドにアクセスする必要があるのはなぜですか?

つまり、現在のクラスで一致するメソッド名が見つかった場合、そのメソッドに互換性がない場合でも、コンパイラーは親クラスから一致するメソッドの検索を停止します。これにより、多くの親クラスのメソッドをオーバーライドする必要なく、いくつかの自動型変換をより論理的に機能させることができると思います。

11
hyde

派生クラスの関数の1つのバリアントをオーバーライドする場合は、すべてのバリアントをオーバーライドする必要があります。 JLledoの提案を使用するか、同じクラスの基本クラスの関数を呼び出すだけの派生クラスで関数のバリアントを記述することができます。

class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
        void func(char[]){};
};

void classB:func(char[] ch)
{
    classA::func(ch);
}
3
Girish Matti