Visual C ++ - 无法调用派生类函数

时间:2014-03-17 06:21:13

标签: visual-c++ inheritance polymorphism derived-class

//我在制作名为Square的垄断游戏中有一个基类。其中一个派生类称为freeParking。 freeParking类有一个叫做playSquare的函数,我试着调用这个函数,但是main中的playSquare函数调用给了我错误。这是我试图使用的代码:

//基本方阵

#pragma once
 #include <string>
 #include <iostream>

using namespace std;

class Square
{
public:
    Square(string d);
    string displayName();
private:
    string squareName;

};

//继承Square类

的freeParking类
#pragma once
#include "Square.h"
#include "Player.h"
#include <iostream>

class freeParking : public Square
{
public:
freeParking(string a);
void playSquare(Player *player, Player *otherPlayer);


private:

};

// freeParking playSquare函数

#include "FreeParking.h"

using namespace std;

freeParking::freeParking(string a)
    :Square(a)
{

}

void freeParking::playSquare(Player *player, Player *otherPlayer)
{
    cout << "Player " << player->returnPlayerPiece() << " lands on free parking" << endl;
    cout << "Player " << player->returnPlayerPiece() << " is resting" << endl;
}

//在main

中调用playSquare函数
vector <Square> squaresVector;
Square* square = new freeParking(squares[readCount]);
squaresVector.push_back(*square);

int a = 0;
for (vector<Square>::iterator it = squaresVector.begin(); it <squaresVector.end(); it++)
    {
        squaresVector[a]->playSquare(Player *p1, Player *p2);
            a++;
    }

//我有什么想法我做错了什么?欢呼声。

1 个答案:

答案 0 :(得分:1)

您尚未playSquare接口的Square部分。您似乎希望playSquare特定于广场的类型,但您也希望能够在Square*上调用它而不知道Square的类型。为此,请将playSquare设为虚拟方法。

class Square {
    string squareName;

public:
    Square(string d);
    string displayName();
    virtual void playSquare(Player* p1, Player* p2) = 0; 
    ...
};

virtual添加到派生类的playSquare声明的前面。这是一个纯虚函数,这意味着它没有在基类中定义,但必须在实际实例化的任何派生类中定义。如果您不喜欢此限制,请将= 0替换为{},以使其为默认定义。我的猜测是,考虑到游戏板的上下文,你需要为每个派生类定义一个定义。

修改

您不能使用std::vector来存储多态对象(具有虚函数的对象)。在这种情况下,向量将仅为其模板参数的类型Square分配内存。任何与派生类相关的数据都将被切断。您可以使用std::vector<Square*>来解决此问题。由于对象不再存储在向量中,我们不再有这个问题。

在相关的说明中,您无法在不知道Square是什么类型Square的情况下复制Square对象,因为freeParking复制构造函数不知道如何处理push_back {1}}对象的一部分。您的a操作会尝试执行此操作。

我还注意到你使用两个循环计数器没有特别的原因。摆脱for(vector<Square*>::iterator it = squaresVector.begin(); it != squaresVector.end(); ++it) { (*it)->playSquare(p1, p2); //p1 and p2 are of type Player* } ,因为你已经定义的迭代器允许你访问向量的每个元素。

playSquare

我怀疑你是想在你传递它们的时候声明{{1}}的论点。