2013-01-08 15 views
27

これは恐らく問題ではありません。私は最近、C++や関数のオーバーロードや継承の高水準なものを混乱させようとすると、奇妙な問題に直面しました。継承されたクラスで関数のオーバーロードが発生するC++の問題

ここでは、問題を示すための簡単な例を示します。

classAclassBの2つのクラスがあります。

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

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

私はclassBは今が異なるため、引数にオーバーロードされた2つのfunc(..)機能を保有すべきである知っていることによります。

しかし、これをメインの方法で試してみると、

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 INT見えません。

どうすればこの問題を解決できますか? C++でオーバーロードがどのように機能するのでしょうか?私はC++の新機能ですが、Javaではこのようなものを利用することができます。

私は既にthis threadが類似の問題について質問していますが、私は2つのケースが異なっていると思います。

答えて

40

必要なのはusingです:

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

それは既に派生クラス内の1つのを見つけたので、それがfuncの基本クラスを検索しません。 usingステートメントは、他のオーバーロードを同じスコープに持ち込み、オーバーロード解決に参加できるようにします。これはよくこの質問の答えの例で説明されて

9

:要するに

Why should I use the "using" keyword to access my base class method?

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

+1

感謝をオーバーロードされている

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

BCSで、int型の引数を渡す必要があります。私はC++の人々が意図的にこのことをしていたのだろうかと思います。任意のプロはありますか?私には相続の考えを台無しにする気がするのですか? – Anubis

+0

@Anubis、それは過負荷解決のルールと一般的な 'using'宣言の目的の問題です。 – chris

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); 
} 
-4

あなたはそれがint型の引数で答え+リンクについて

+0

詳細な回答をお試しください。 – easwee

関連する問題