2016-09-30 63 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 

JugadorHumano.cpp

#include "JugadorHumano.h" 
using namespace std; 

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

然后,在第三类方法无关,这两个外使用他们,我已经取得:

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

感谢您的关注。

编辑:对不起,这是我的第一个问题,增加了cpp文件

EDIT2地:由@ Raindrop7 sugested的变化,现在编译,但仍然调用基方法,它打印“被称为”,而不是做函数getline。

EDIT3:谢谢

OLD:当编译器到达getInput它引发错误 “参考 'Jugador :: getInput()' 是未定义”。我不知道为什么会发生这种情况,也没有办法解决这个问题。

+3

查看对象切片 – NathanOliver

+0

请查看[MCVE]。你的代码片段既没有getinput()方法的实现,所以是的,链接器找不到它。 –

+0

你在哪里定义了Jugador :: getInput()? – HazemGomaa

回答

0

如果不希望在你的基类(Jugador)来定义getInput(),按你的意见,那么你需要使它纯虚

virtual string getInput()=0; 

但是,您将无法实例Jugador因为它会成为一个抽象类,

Jugador rojo; // error tries to instantiate abstract class 

因此,在你的第三类,你需要创建JugadorHumano对象

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

尝试了类似的'Jugador * rojo; JugadorHumano jug = JugadorHumano(true); rojo => &jug; rojo-> getInput();' 一个迂回的方式,编译器仍然试图调用基本方法,并抛出一个错误的抽象。 – Signum

+0

好吧,我设法使它与你的建议一起工作(我没有把它变成纯虚拟的,因为我需要一些具体的东西)。所以,如果我不做pointer = new ObjectConstructor,而是从已经创建的对象中获取引用,它会尝试指向基本方法而不是子对象 – Signum

+0

@Signum我很高兴您将它整理出来。对不起,我不完全确定为什么你的评论中的其他代码不起作用。可能会考虑提出更多细节问题。 – HazemGomaa

相关问题