首先抱歉使用外语代码。
我遇到了问题,当我编译下面的代码时,编译器调用基本方法而不是子方法。
我有这个基类:
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进行了更改,现在编译但仍然调用基本方法,它打印“Is Called”而不是执行getline。
EDIT3:谢谢
OLD:当编译器到达getInput时,它会抛出一个错误“引用'Jugador :: getInput()'是未定义的”。我不确定为什么会发生这种情况,也不能解决这个问题。
答案 0 :(得分:0)
如果您不想在基类(Jugador)中定义getInput(),根据您的评论,那么您需要将其设为纯虚拟
virtual string getInput()=0;
但是,你将无法实例化Jugador,因为它将成为一个抽象类,
Jugador rojo; // error tries to instantiate abstract class
因此,在你的第三堂课中你需要创建JugadorHumano对象
Jugador * rojo = new JugadorHumano(true);
rojo->getInput();