我有一个提供给我的主要抽象类,并且必须基于该类创建子类(不能修改):
class Spaceship
{
protected:
string m_name; // the name of the ship
int m_hull; // the hull strenght
public:
// Purpose: Default Constructor
// Postconditions: name and hull strength set to parameters
// -- INLINE
Spaceship(string n, int h)
{
m_name = n;
m_hull = h;
}
// Purpose: Tells if a ship is alive.
// Postconditions: 'true' if a ship's hull strength is above zero,
// 'false' otherwize.
// -- INLINE
bool isAlive()
{
return (m_hull > 0);
}
// Purpose: Prints the status of a ship.
// -- VIRTUAL
virtual void status() const = 0;
// Purpose: Changes the status of a ship, when hit by a
// weapon 's' with power level 'power'
// -- VIRTUAL
virtual void hit(weapon s, int power) = 0;
string getName() const
{
return m_name;
}
}; //Spaceship
所以是我的孩子班的一个例子:
class Dreadnought: public Spaceship
{
int m_shield;
int m_armor;
int m_type;
public:
Dreadnought( string n, int h, int a, int s ): Spaceship( n, h ),m_shield( s ),m_armor(a),m_type(dreadnought){}
virtual void status() const
{
// implementation not shown to save space
}
virtual void hit(weapon s, int power)
{
// implementation not shown to save space
}
int typeOf(){ return m_type; }
};
在我的主要代码中,我有一个不同类型的宇宙飞船的动态数组:
Spaceship ** ships;
cin >> numShips;
// create an array of the ships to test
ships = new Spaceship * [numShips];
然后我从用户那里得到输入来在这个数组中声明不同类型的船,比如:
ships[0] = new Dreadnought( name, hull, armor, shield );
我的问题是,当我去删除数组时,没有调用正确的析构函数,而是调用了 Spaceships,这是否会造成内存泄漏,因为成员变量“m_shield,m_armor”没有被删除并挂起?如果是这样,有没有比使用 var m_type 和调用更好的方法来获取类型:
if( ships[i]->typeOf() == 0 )
delete dynamic_cast<Frigate*>(ships[i]);
else if( ships[i]->typeOf() == 1 )
delete dynamic_cast<Destroyer*>(ships[i]);
else if( ships[i]->typeOf() == 2 )
delete dynamic_cast<Battlecruiser*>(ships[i]);
else if( ships[i]->typeOf() == 3 )
delete dynamic_cast<Dreadnought*>(ships[i]);
else
delete dynamic_cast<Dropship*>(ships[i]);
我声明的 Spaceship 类中的问题 #2:virtual int typeOf() = 0; 并将其注释掉,有没有一种方法可以在子类中实现这个函数而不在父类中声明,这样我就可以像上面显示的那样使用它?当我不声明它时,我得到编译器错误:
错误:'class Spaceship' 没有名为 'typeOf' 的成员
我认为这再次与动态套管有关。
任何帮助都会很棒,
谢谢纳特
编辑:
为了澄清我的第一个问题,如果我这样做了,我会不会有内存泄漏:
删除船舶[i];
还是我应该这样做:
删除 dynamic_cast(ships[i]);
删除仅在派生类中的成员变量?
纳克斯