1

我有三个班。基类被称为Jet

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

protected:
    int mfuel;
};

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

第二类称为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) {}

第三个类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 B18,只继承numMissilesfrom F16?例如:

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 的一部分初始化为 b18,就像 numMussiles 部分而不是构造函数的燃料一样,我正在试验的事情......简而言之,选择我想在成员中继承的内容初始化器

看起来重载的构造函数可以解决您的问题。向您的类添加另一个构造函数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 回答