对象切片问题?

时间:2011-11-30 18:32:37

标签: c++ polymorphism

当我检查向量的元素时,我遇到了一个奇怪的问题,该向量应该通过基类指针多态指向派生对象。

这是我的载体:

std::vector<Gun*> weapons;

这是实例化:

weapons.reserve(3);
weapons.push_back(new Pistol());
weapons.push_back(new Rifle());
weapons.push_back(new Shotgun());

这很好用,但是一旦构造函数退出,对象现在是基类类型,而不是派生类型。为什么会这样?

2 个答案:

答案 0 :(得分:1)

你有一些错误:

std::vector<Bullet> Bullets();

返回项目符号的副本,而不是基础对象。所以当你这样做时:

Bullets().push_back(Bullet(Position(), Rotation(), velocity, Colour()));

它没有按照你的预期去做。

你最有可能想要两者:

const std::vector<Bullet>& Bullets() const;
std::vector<Bullet>& Bullets();

话虽如此,就像@John所说,Access违规很可能是武器阵列不够大的问题(也许是因为上面的错误)。错误将出现在填充武器的代码中。你说RIFLE是2,但是你发布的代码实际上是索引1,而不是2,所以我猜你有SHOTGUN设置为3,它应该是2,这超出了数组的范围,因此访问保护错误。经典的一个一个。

答案 1 :(得分:0)

您似乎没有以任何方式切割对象 - 这可能不是问题。

最可能的嫌疑是您访问vector的方式以及vector中的项目数量与您认为应该存在的数量相同的概率:

weapons[RIFLE]

你怎么知道这里有一个有效的对象?鉴于您正在获得访问冲突,似乎该索引上没有有效的对象。

你应该做更多的事情:

if( weapons.size() >= RIFLE )
{
  Gun* gun = weapons.at(RIFLE);
  gun->Ammo();
}
else
{ 
  cerr << "WHOA!  Something blowed up...";
}