提供されたメインの抽象クラスがあり、このクラスに基づいてサブクラスを作成する必要があります (これは変更できません)。
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]); を削除します。
派生クラスのみにあるメンバー変数を削除するには?
タナクス