我有一个Base和派生类对象的向量,但我无法访问存储在向量中的派生对象继承的数据成员

时间:2013-02-17 19:31:46

标签: c++ inheritance vector

忍受我,我在C ++方面相对较新。

这是我的项目。我想基本上创建一个简单的国际象棋游戏。

我有一个基类gamePiece,我认为它最终将成为一个抽象类(但现在它不是)

基类gamePiece里面有一堆数据成员:colorOfPiece,rankOfPiece,fileOfPiece等。它还有一个函数,void displayPieceInfo(),它只是通过cout在控制台上显示所有这些值。

我打算从这个中获得许多派生类。现在我有一个“车”子类。

我想在一个向量中添加各种类型的片段,所以稍后我可以用迭代器遍历它。

这是我遇到的问题。

vector<gamePiece> vectorOfAllGamePieces;
vector<gamePiece>::iterator itGamePieces; 

我将一个Rook推入向量作为第一个元素。所有构造函数看起来都运行正常,初始化变量。然而,当我尝试在第一个元素上运行显示功能时,字符串是空的/单元化的。

itGamePieces=vectorOfAllGamePieces.begin();
itGamePieces->displayPieceInfo();

如果我将通用游戏内容推入向量中,一切都会正常显示。

我是否允许使用混合类型的对象来获得这样的矢量 - 例如,派生类的对象,父类的对象,从同一父类派生的第二类的对象

如果是这样,为什么你认为数据成员的值没有正确显示,即使我已经在构造函数中设置了它们?

2 个答案:

答案 0 :(得分:3)

不是真的,因为切片。当您将派生对象添加到vector<gamePiece>时,它会被切片并且gamePiece对象实际上被添加到向量中。

你需要使用(智能)指针的矢量。

答案 1 :(得分:1)

问题是这样的,Rook GamePiece。但你不能在一个GamePieces的地方存放一辆车。您只能施放 Pointer to RookPointer to GamePiece。因此,您的向量必须保存 NOT GamePieces,但GamePiece *(指向GamePieces的指针)。

std::vector<GamePiece *> vectorOfAllGamePieces;

但这可能会给你内存管理带来麻烦。另一种方法是在不使用指针的情况下存储Handles。 (句柄类似于指针的指针)。或者您当然可以使用智能指针。

快速破解(这是一种“黑客”,在某些人看来是“邪恶的”),

std::vector<Rook> allRooks;
std::vector<Pawns> allPawns;
.....
std::vector<Queen> allQueens;
King theKing;

std::vector<GamePiece *> allPieces;

allPieces将包含指向其他向量中对象的指针。 当你完全知道所有类型的棋子时,我觉得这很好(我猜这是国际象棋)。