2016-09-30 7 views
0

外国語でコードをごめんなさい申し訳ありません。子どもの代わりにコンパイラが基本クラスのメソッドを呼び出す

私は、コンパイラが下のコードをコンパイルするときに問題が発生しました。コンパイラは、子の代わりに基本メソッドを呼び出します。

私は、この基本クラスを持っている:

Jugador.h

#ifndef JUGADOR_H_ 
#define JUGADOR_H_ 

#include <iostream> 
using namespace std; 

class Jugador{ 
    protected: 
     bool color;//true->rojo false-> azul 
    public: 
     Jugador(bool rojo) { color = rojo; } 
     Jugador() {} 
     virtual string getInput(); 
     ~Jugador(){} 
}; 

#endif 

Jugador.cpp

#include "Jugador.h" 
using namespace std; 
string Jugador::getInput(){ 
cout<<"Is Called"<<endl; 
} 

そして、この子クラス: JugadorHumano.h

#ifndef JUGADORHUMANO_H_ 
#define JUGADORHUMANO_H_ 
#include <iostream> 
#include <string> 
#include "Jugador.h" 

using namespace std; 

class JugadorHumano: public Jugador { 
    public: 
     JugadorHumano(bool rojo) :Jugador(rojo) {} 
     virtual string getInput();//Tested with override too 
}; 

#endif 

#include "JugadorHumano.h" 
using namespace std; 

string JugadorHumano::getInput(){ 
    string input; 
    getline(cin, input); 
    return input; 
} 

JugadorHumano.cpp

はその後、それら二つとは無関係の第三のクラスのメソッドに外に私が作ったそれらを使用して:あなたの注意のための

Jugador rojo; 
rojo=JugadorHumano(true); 
rojo.getInput(); 

感謝を。

編集:申し訳ありませんが、これは私の最初の質問ですが、CPPファイル

EDIT2追加:@ Raindrop7によって推薦した変更を、今コンパイルしますが、それでも基本メソッドを呼び出し、それが代わりにやっての「と呼ばれている」印刷しますgetline。

EDIT3:ありがとう

OLD:コンパイラは、それは " 'Jugador ::か、getInput()' 未定義ですへの参照" エラーがスローされますか、getInputする到着すると。なぜこれが起こるのか、それを修正する方法はわかりません。

+3

オブジェクトのスライスをルックアップ – NathanOliver

+0

[MCVE]を確認してください。あなたのスニペットにはgetinput()メソッドの実装がないので、リンカーはそれを見つけることができません。 –

+0

Jugador :: getInput()をどこで定義しましたか? – HazemGomaa

答えて

0

コメントごとに、その後、あなたはそれ純粋仮想

virtual string getInput()=0; 

にする必要があるとして、しかし、あなたがすることはできません、あなたのベースクラス(Jugador)で)か、getInputを(定義したくない場合それは抽象クラスとなりますので、

Jugador rojo; // error tries to instantiate abstract class 

このように、あなたの第三のクラスにあなたがJugadorHumanoオブジェクトを作成する必要があり、Jugadorをインスタンス化

Jugador * rojo = new JugadorHumano(true); 
rojo->getInput(); 
+0

同様の' Jugador * rojo;ジュガドゥマ(玉野) rojo-> &jug; rojo-> getInput(); ' ラウンドアバウトの方法では、コンパイラーはまだ基本メソッドを呼び出しようとし、抽象クラスのエラーをスローします。 – Signum

+0

さて、私はあなたの提案(私はいくつかの具体的なものが必要になるので、私はそれを純粋なバーチャルにしていませんでした)で動作させることができました。だから、もし私がポインタ=新しいObjectConstructorをしないで、代わりに私はすでに作成されたオブジェクトからの参照を取得します。子の代わりに基本メソッドを指すようにします。 – Signum

+0

@Signum私はあなたがそれをソートしてうれしいです。申し訳ありませんが、私はあなたのコメントにあなたが持っている他のコードがうまくいかない理由を完全には分かっていません。詳細をつけて別の質問をすることを検討することがあります。 – HazemGomaa

関連する問題