これはおそらくnoobの質問です。私は最近、c ++、関数のオーバーロード、および継承で高レベルのものをいじろうとするときに奇妙な問題に直面しました。
問題を示すために、簡単な例を示します。
以下のように、classA
とclassB
の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つのケースは異なると思います。
必要なのはusing
だけです。
class classB:public classA{
public:
using classA::func;
void func(int){};
};
派生クラスで既に見つかったため、func
の基本クラスを検索しません。 using
ステートメントは、他のオーバーロードを同じスコープに入れ、オーバーロードの解決に参加できるようにします。
たとえば、この質問の回答でよく説明されています。
「using」キーワードを使用して基本クラスのメソッドにアクセスする必要があるのはなぜですか?
つまり、現在のクラスで一致するメソッド名が見つかった場合、そのメソッドに互換性がない場合でも、コンパイラーは親クラスから一致するメソッドの検索を停止します。これにより、多くの親クラスのメソッドをオーバーライドする必要なく、いくつかの自動型変換をより論理的に機能させることができると思います。
派生クラスの関数の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);
}