我有三节课。基类名为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) {}
类似上面的(当然不起作用,可能有逻辑错误)。
答案 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构造函数。