构造函数的继承问题

时间:2013-01-22 18:53:00

标签: c++ inheritance

我有三节课。基类名为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 fuel删除B18,并仅从numMissiles继承F16?例如:

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

类似上面的(当然不起作用,可能有逻辑错误)

3 个答案:

答案 0 :(得分: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)   {}

我不确定这是否正是你所需要的,但也许它会有所帮助。我可能也错了,但我有点怀疑你可以通过继承来保持基类的变量。最接近的是将指针变量保持为未初始化。

答案 1 :(得分: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中选择第一个构造函数。请注意,最好完全初始化类,这意味着将每个成员初始化为某些[默认]值(即使您在特定情况下不需要它们)。

答案 2 :(得分: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构造函数。