C ++:使用函数调用基类

时间:2015-12-21 10:42:03

标签: c++ function inheritance derived-class base-class

如何在Derived课程中使用Base课程?

编辑2: 在main中调用virtual void move(Derived1 &race);时,它不会编译,但会抛出Derived1 is not found的错误。当我在没有Derived1类对象的情况下调用函数时,它会进行编译,但函数似乎没有做任何事情。是否可以使该功能起作用?

编辑:

基础课程

class Base {
protected:
    int x, y;
    int moves;
    char name;
    bool free;
public:
    Base();
    virtual void move(Derived1 &race);
};

派生类1

class Derived1 : public Base {
private:
    const int x = 10;
    const int y = 60;
    Base ***track;
public:
    Derived1(int x = 10, int y = 60);
    void printBoard();
    Base ***getArray() const;
    ~Derived1();
    void move{}
};

派生类2

class Derived2 : public Base {
public:
    Derived2();
    Derived2(int x, int y);
    void move(Derived1& race);
};

导出2的void move()函数

它检查阵列中的障碍物。如果找到自由空间,它会移动到那里。代码非常糟糕,因为我还没有完成它,只是一个临时代码才能让一切顺利进行。

void Derived2::move(Derived1& race) {
    if (race.getArray()[x][y + 1]->getFree() == true) {
        delete[] race.getArray()[x][y];
        race.getArray()[x][y] = new Base();
    }
    if (race.checkFreeY(x, y + 1, 3) == true) {
        delete[] race.getArray()[x][y + 4];
        race.getArray()[x][y + 4] = new Derived2(x, y + 4);
        moves++;
    }
    else if (race.checkFreeX(x, y + 1, 3) == true) {
        delete[] race.getArray()[x + 3][y + 1];
        race.getArray()[x + 3][y + 1] = new Derived2(x + 3, y + 1);
        moves++;
    }
    else {
        moves++;
    }
}

这项任务是在每个其他派生类中使用virtual move()函数进行比赛,该对象会在具有障碍物的2D数组中移动对象。

编辑3:

我试图制作的电话:

Derived1 track;
track.fillTrack();
track.genBushes();
track.genRacers();
track.getArray()[0][0]->move(track);

执行此操作时,我会收到以下错误:

syntax error: identifier 'Derived1'
'void Base::move(Derived1&)': overloaded member function not found in 'Base'
"void Base::move(<error-type> &race)"

Base中编辑移动功能,如下virtual void move() {}并尝试调用track.getArray()[0][0]->move();我收到以下错误:

too few arguments in function to call

1 个答案:

答案 0 :(得分:0)

在定义Base之前,您需要说

class Derived1;

这将使移动声明有效:

virtual void move(Derived1 &race);

您需要提供Base::moveDerived1::move的定义(您可以通过将其标记为纯虚拟来删除对Base::move的需求。)