我确定这只是我正在做的一些愚蠢的语法错误,但是当我的CNeck
派生的CLimb
调用其默认构造函数时,CNeck()
一切都按预期工作。当它调用不同的构造函数CNeck(*parent)
时,它似乎调用了大约一半的指定基础构造函数,然后使用编译器默认构造函数或奇怪的东西。
的main.cpp
int _tmain(int argc, _TCHAR* argv[])
{
CNeck neck01;
CLimb *ptr;
ptr = &neck01;
CNeck neck02(ptr);
return 0;
}
limb.h(父类)
class CLimb
{
public:
CLimb(void);
CLimb(CLimb *_parent);
~CLimb(void);
float cut;
float bone;
float resistance;
//attributes
bool isBurned;
bool isBleeding;
bool isOnFire;
bool isNeedFirstaid;
CLimb *parent;
};
limb.cpp(父类)
#include "limb.h"
CLimb::CLimb(void) :
cut(10),
bone(10),
resistance(10),
//attributes
isBurned(0),
isBleeding(0),
isOnFire(0),
isNeedFirstaid(0)
{
parent = NULL;
}
CLimb::CLimb(CLimb *_parent) :
cut(10),
bone(10),
resistance(10),
//attributes
isBurned(0),
isBleeding(0),
isOnFire(0),
isNeedFirstaid(0)
{
parent = _parent;
}
CLimb::~CLimb(void)
{
}
neck.h(儿童班)
#include "limb.h"
class CNeck :
public CLimb
{
public:
CNeck(void);
CNeck(CLimb *_parent);
~CNeck(void);
};
neck.cpp(儿童班)
#include "Neck.h"
CNeck::CNeck(void)
{
}
CNeck::CNeck(CLimb *_parent) : CLimb(*_parent)
{
}
CNeck::~CNeck(void)
{
}
正如您所看到的,除了调用父代的构造函数之外,子类不执行任何操作,但是当我单步执行该程序时,我得到以下结果:
CNeck neck01;
:正常的
CNeck neck02(ptr);
:值cut,bone,resistance和isBurned都具有正确的值,但isBleeding,isOnFire和isNeedFirstaid都等于1而不是零。 CNeck :: CNeck(* parent)的主体仍在执行
在我进行测试并调用CLimb limb(ptr);
而不是CNeck neck02(ptr);
时,所有值都分配了正确的值。
答案 0 :(得分:2)
CNeck::CNeck(CLimb *_parent) : CLimb(*_parent)
应该是
CNeck::CNeck(CLimb *_parent) : CLimb(_parent)
此外,我真的不明白这是如何编译的:
ptr = &hand;
hand
根本没有声明,但看起来你错过了它,同时复制粘贴代码。
答案 1 :(得分:1)
你的构造函数被标记为CLimb(CLimb *_parent);
,这意味着它需要一个指向CLimb的指针,但在CNeck
构造函数中,
CNeck::CNeck(CLimb *_parent) : CLimb(*_parent)
你取消引用指针,它调用CLimb(CLimb&)
这是复制构造函数。将*_parent
转为_parent
即可解决此问题。另外,您可能还想定义一个复制构造函数。
在其他新闻中,请勿这样做:
CLimb *ptr;
ptr = &hand;
这样做:
CLimb *ptr = &hand;
避免浪费周期。
对于不带参数的函数,你也不需要参数列表中的void
(这就是C的做法,而不是C ++)。例如:
CLimb(void);
CLimb(CLimb *_parent);
~CLimb(void);
应该是
CLimb();
CLimb(CLimb *_parent);
~CLimb();
我知道这与你的问题无关,但它的风格很好。