派生类不调用整个基础构造函数

时间:2011-08-16 17:27:46

标签: c++ class constructor derived-class

我确定这只是我正在做的一些愚蠢的语法错误,但是当我的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);时,所有值都分配了正确的值。

2 个答案:

答案 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();

我知道这与你的问题无关,但它的风格很好。