编译器调用基类方法而不是子类方法

时间:2016-09-30 19:21:18

标签: c++ inheritance

首先抱歉使用外语代码。

我遇到了问题,当我编译下面的代码时,编译器调用基本方法而不是子方法。

我有这个基类:

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()'是未定义的”。我不确定为什么会发生这种情况,也不能解决这个问题。

1 个答案:

答案 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();