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