The code below shows the ill effects of hiding a non-virtual
constructor of a base class, and then using the derived class as a
base one.
// this program is buggy! #include<iostream> class Base { public: Base() { std::cerr << "constructing Base " << this << std::endl; i = new int; } ~Base() { std::cerr << "destroying Base " << this << std::endl; delete i; } private: int* i; }; class Derived : public Base { public: Derived() { std::cerr << "constructing Derived " << this << std::endl; d = new double; } ~Derived() { std::cerr << "destroying Derived " << this << std::endl; delete d; } private: double* d; }; int main(int argc, char** argv) { using namespace std; int ret = 1; Base* thePtr = new Derived; delete thePtr; return ret; }The output of this program is
constructing Base 0x804a008 constructing Derived 0x804a008 destroying Base 0x804a008This is a bug, because the Derived object was never deallocated. At best, this is a memory leak. In some other cases it may become the source of more serious problems. Can you explain what happened and how to fix the program?