Производный класс не вызывает весь базовый конструктор - PullRequest
0 голосов
/ 16 августа 2011

Я уверен, что это просто глупая синтаксическая ошибка, которую я делаю, но когда мой класс 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, сопротивления и isBurned имеют правильные значения, но isBleeding, isOnFire и isNeedFirstaid равны 1 вместо нуля.Тело CNeck :: CNeck (* parent) все еще выполняется.
Когда я тестировал и вызывал CLimb limb(ptr); вместо CNeck neck02(ptr);, всем значениям были присвоены правильные значения.

Ответы [ 2 ]

2 голосов
/ 16 августа 2011
CNeck::CNeck(CLimb *_parent) : CLimb(*_parent)

должно быть

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

Кроме того, я не очень понимаю, как это скомпилировано:

ptr = &hand;

hand вообще не объявлено, но похоже, что вы пропустили его при копировании, вставляя код здесь.

1 голос
/ 16 августа 2011

Ваш конструктор помечен 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();

Я знаю, что это не связано с вашим вопросом, но это хороший стиль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...