2016-06-14 20 views
2

私はいつも基底クラスのパブリックメソッドは派生クラスによって継承されると思っていましたが、派生クラスにはその特定のメソッドの定義がないと思っていました。 「もしかして;、1きあまりにも多くの引数が関数の呼び出し、0を期待:7を、私は派生クラスで定義されていない基本クラスの関数を呼び出す方法は?

は "エラーが言ってコンパイル・エラーが発生します:たとえば

#include <iostream> 

using namespace std; 


    class A { 
    public: 
     int f() { cout << 3; return 0;} 
     int f(int x) {cout << x; return 0;} 
    }; 

    class B: public A { 
    public: 
     int f() {std::cout << 5; return 0;} 

    }; 


    int main(){ 
     B ob; 
     ob.f(7); 

     return 0; 
    } 

は私がする結果を期待していましたA :: f '?

私はエラーが何を言おうとしているのか分かっていますが、基本クラスの機能が呼び出されていないことはほとんど分かりません。

+3

を内のすべての基底クラスバージョン –

+0

使用する仮想キーワードを隠しA – ZivS

+1

私はリンクをstackoverflowから見つけました - http://stackoverflow.com/questions/411103/function-with-same-n問題を明解に説明する派生クラスです。 – pokche

答えて

6

派生クラスのメソッドをオーバーロードすると、すべての基本クラスのバージョンが隠されます。署名が異なる場合でも、基本クラスと同じ名前のメソッドが派生クラスに存在する場合、直接呼び出すことはできません基本クラスのバージョン。

あなたの投稿コードで

ob.A::f(7); 
2

B::fA::fのすべてのバージョンを行うことができます。いくつかの方法を使用してBタイプのオブジェクトからA::f(int)を呼び出すことができます。

  1. A::fを明示的に使用してください。

    B ob; 
    ob.A::f(7); 
    
  2. Bの範囲にA::fのすべてのバージョンをもたらします。

    class B: public A { 
        public: 
         using A::f; 
         int f() {std::cout << 5; return 0;} 
    
    }; 
    

    今、あなたは使用することができます。

    B ob; 
    ob.f(7); 
    
+0

@ R Sahuしかし、上記のケースはJavaで動作します。 – a874

+0

@ a874、私はJavaに精通していません。私はそれについてコメントすることはできません。しかし、これはC++で動作するかどうかは関係ありません。 –

2

あなたは別の方法を使用することができます:派生クラスで関数をオーバーロードする

class B: public A { 
    public: 
     using A::f; 
     int f() {std::cout << 5; return 0;} 

    }; 
関連する問題