The most common mistake to do in a constructor as well as in a destructor, is to use polymorphism. Polymorphism often does not work in constructors !
e.g.:
class A
{
public:
A(){ doA();}
virtual void doA(){};
}
class B : public A
{
public:
virtual void doA(){ doB();};
void doB(){};
}
void testB()
{
B b; // this WON'T call doB();
}
this is because the object B is not yet constructed while performing the constructor of the mother class A... thus impossible for it to call the overriden version of void doA();
An example where polymorphism
will work in constructor:
class A
{
public:
void callAPolymorphicBehaviour()
{
doOverridenBehaviour();
}
virtual void doOverridenBehaviour()
{
doA();
}
void doA(){}
};
class B : public A
{
public:
B()
{
callAPolymorphicBehaviour();
}
virtual void doOverridenBehaviour()
{
doB()
}
void doB(){}
};
void testB()
{
B b; // this WILL call doB();
}
This time, the reason behind is: at the time the virtual
function doOverridenBehaviour()
is invoked, the object b is already initialized (but not yet constructed), this means that its virtual table is initialized, and thus can perform polymorphism.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…