55

これはおそらく初心者の質問です、それについては申し訳ありません。最近、C ++の高レベルのもの、関数のオーバーロード、継承をいじろうとしたときに、奇妙な問題に直面しました。

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

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

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

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

私が知っていることによると、異なる引数のためにオーバーロードされた2つの関数を持っているclassBはずです。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;
}

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

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

同様の問題について尋ねるこのスレッドをすでに見つけましたが、2つのケースは異なると思います。

4

5 に答える 5

71

必要なのはusing

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

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

于 2013-01-08T09:49:48.577 に答える
12

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

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

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

于 2013-01-08T09:53:47.327 に答える
3

派生クラスの関数の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);
}
于 2013-01-10T02:55:00.363 に答える
1

提案されたソリューションは、メンテナンスの問題を引き起こします。派生using A::funcクラスにを挿入するには、再設計ソフトウェアが派生クラスに配置された句の使用に敏感である必要があります。つまり、基本クラスを単独で変更するのではなく、メンテナが派生クラスも変更する必要があります。からに移動するbase<-derived1としbase<-derived2<-derived1ます。ここで、using句をusing base::funcに変更する必要があります。これにより、using句using derived2::funcの検討が強制され、メンテナンスのコストが増加します。これがかなり長い間C++の標準化の取り組みにあったと言っても、その考えが誤解されているように見えることは変わりません。継承の概念を中断します。これについての私の考え。

于 2021-08-01T16:08:38.057 に答える
-5

int型の引数をで渡す必要があります

objB.func(b);    //here's the problem!

bcsint引数でオーバーロードされています

于 2014-02-13T08:51:05.760 に答える