1

私は3つのクラスを持っています。基本クラスは次のように呼ばれJetます。

class Jet
{
public :
    Jet(int fuel);
    void fly();

protected:
    int mfuel;
};

Jet::Jet(int fuel): mfuel(fuel) {}

2 番目のクラスは次のように呼ばれF16ます。

class F16 : public Jet
{
public:
    F16(int fuel, int numMissiles);
    void fireMissile();

protected:
    int mNumMissles;
};

F16::F16(int fuel, int numMissiles): Jet(fuel), mNumMissles(numMissiles) {}

3 番目のクラスB18は、通常どおり からすべてを継承しますF16

class B18 : public F16
{
public:
    B18(int fuel, int numMissiles, int bullets);
    void fireBullets();

private:
    int mBullets;

};

ここで私の質問は、メンバーメンバー初期化子に方法があるかどうかです:

B18::B18(int fuel, int numMissiles, int bullets) :
        F16(fuel, numMissiles), mBullets(bullets) {} 

...だから、 int fuelfromを消去して、 fromB18のみを継承できますか? 例えば:numMissilesF16

B18::B18(int numMissiles, int bullets) :
        F16(numMissiles), mBullets(bullets) {}

上記のようなもの(もちろん機能せず、おそらく論理エラーがあります) .

4

3 に答える 3

2

その場合の継承が完全にブロックされるとは思えませんが、コードのメンバー初期化行について言及しました。その中で、次のようなことができるはずです:

B18::B18(int numMissiles,int bullets): F16(30,numMissiles),mBullets(bullets)   {}

あなたはすでにそれを知っているかもしれません。別のオプションは次のようなものです。

public:
    F16(int numMissiles, int fuel = 45);

と:

B18::B18(int numMissiles,int bullets): F16(numMissiles),mBullets(bullets)   {}

それがまさにあなたが必要としているものかどうかはわかりませんが、おそらく役立つでしょう。繰り返しますが、これについては間違っているかもしれませんが、基本クラスの変数が継承によって設定されないようにすることができるかどうかはちょっと疑わしいです。最も近いのは、ポインター変数を初期化しないままにすることです。

于 2013-01-22T19:00:53.637 に答える
1

あなたのコメントは、問題に関するより多くの情報を提供しました。だから私は可視性のためにここに引用しています:

F16 の一部だけを numMussiles 部分のように b18 に初期化する可能性があるかどうかを実験していたものであり、コンストラクターからの燃料でもありません...つまり、メンバーで継承したいものを選択するということです。初期化子

オーバーロードされたコンストラクターが問題を解決できるようです。クラスに別のコンストラクターを追加してF16、初期化するものに基づいて派生クラスで適切なコンストラクターを選択できるようにします。

できることは次のとおりです。

class F16 : public Jet
{
public:
  F16(int numMissiles); //<------ add this
  F16(int fuel,int numMissiles);
  void fireMissile();

  protected:
  int mNumMissles;
};

次に、初期化するものに基づいてコンストラクターを選択できます。

//unchanged : from your code!
B18::B18(int numMissiles,int bullets): F16(numMissiles),mBullets(bullets) {}

から最初のコンストラクターを選択しF16ます。クラスを完全に初期化する方が良いことに注意してください。つまり、すべてのメンバーをいくつかの [デフォルト] 値に初期化します (特定のケースでは必要ない場合でも)。

于 2013-01-22T19:14:10.017 に答える
0

存在しない値から継承できるため、正確に何を意味するのかよくわかりません。しかし、おそらくあなたがやろうとしていることは、デフォルトのパラメータを含んでいますか? たとえば、次のようになります。

class Jet
{
public :
   Jet(int fuel);
   void fly();

protected:
   int mfuel;
};

Jet::Jet(int fuel): mfuel(fuel) {}

class F16 : public Jet
{
public:
   F16(int numMissiles = 10, int fuel = 20);
   void fireMissile();

protected:
   int mNumMissles;
};

F16::F16(int numMissiles, int fuel): Jet(fuel), mNumMissles(numMissiles) {}

class B18: public F16
{
public :
   B18(int bullets, int numMissiles, int fuel);
   B18(int bullets);
   void firebullets();

private:
   int mBullets;
};

B18::B18(int bullets, int numMissiles, int fuel) : F16(numMissiles, fuel), mBullets(bullets) {}
B18::B18(int bullets): F16(), mBullets(bullets) {}

このように、単一の int パラメータを持つ B18 オブジェクトを作成すると、デフォルト パラメータを使用して F16 コンストラクタが呼び出されます。

于 2013-01-22T19:12:03.143 に答える