簡體   English   中英

派生的 Class 不調用整個基本構造函數

[英]Derived Class not Calling Entire Base Constructor

我確定這只是我正在犯的一些愚蠢的語法錯誤,但是當我從CNeck派生的CLimb調用其默認構造函數時, CNeck()一切都按預期工作。 當它調用不同的構造函數CNeck(*parent)時,它似乎調用了大約一半的指定基本構造函數,然后使用編譯器默認構造函數或一些奇怪的東西。

主文件

int _tmain(int argc, _TCHAR* argv[])
{
    CNeck neck01;
    CLimb *ptr;
    ptr = &neck01;
    CNeck neck02(ptr);
    return 0;
}

肢體.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;
};

肢體.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)
{
}

頸部.h(子類)

#include "limb.h"
class CNeck :
    public CLimb
{
public:
    CNeck(void);
    CNeck(CLimb *_parent);
    ~CNeck(void);
};

頸部.cpp(子類)

#include "Neck.h"


CNeck::CNeck(void)
{
}

CNeck::CNeck(CLimb *_parent) : CLimb(*_parent)
{
}

CNeck::~CNeck(void)
{
}

如您所見,子 class 除了調用父的構造函數之外沒有做任何事情,但是當我逐步執行程序時,我得到以下結果:
CNeck neck01; : 普通的
CNeck neck02(ptr); :cut、bone、resistance 和 isBurned 都有合適的值,但是 isBleeding、isOnFire 和 isNeedFirstaid 都等於 1 而不是 0。 CNeck::CNeck(*parent) 的主體仍在執行。
當我測試並調用CLimb limb(ptr); 代替CNeck neck02(ptr); 所有的值都被分配了正確的值。

CNeck::CNeck(CLimb *_parent) : CLimb(*_parent)

應該

CNeck::CNeck(CLimb *_parent) : CLimb(_parent)

此外,我真的不明白這是如何編譯的:

ptr = &hand;

hand根本沒有聲明,但看起來你在復制粘貼代碼時錯過了它。

您的構造函數被標記為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();

我知道這與您的問題無關,但它的風格很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM