Yes, base class constructors are called when an instance of a derived class is destroyed. The one case you need to watch out for is if you delete
a derived object via a pointer to the base:
class B
{
public:
~B();
}
class D : public B
{
public:
~D();
};
void f()
{
B* p = new D();
delete p; // will (probably) not call ~D()
}
To make cases like the above work, ~B() must be declared virtual
.
class B
{
public:
virtual ~B();
};