Back to slide -- Keyboard shortcut: 'u'        next -- Keyboard shortcut: 'n'          destructors-inheritance/prog2-f15.cc - Base class A and derived class B with non-virtual destructors - motivation.Lecture 5 - slide 8 : 40
Program 1

// Illustration of non-virtual destructors. Motivation for next version of the program.
// The B-object pointed to by a1 is not properly destructed.

#include <iostream>

using namespace std;

class A {
private:
   double a;
public:

  A(double a): a(a){};
  ~A(){cout << "A destructor" << endl;}    // Non-virtual destructor

  // Class A is assumed to have virtual functions.
  //....
};

class B : public A {
private:
  double b;
public:
  B(double b): A(b-1), b(b){};
  ~B(){cout << "B destructor" << endl;}

  //...
};

void e(){
  cout << "Now start of e" << endl;      
  B b1(6.0);                              // b1 contains a B object
  
  // Work on b1.

  cout << "Now end of e" << endl;         // b1 goes out of scope. It is destructed at both B and A level.
}  

void f(){
  cout << "Now start of f" << endl;      
  A *a1 = new B(5.0);                     // a1 points to a B object on the free store.

  // Work on a1

  delete a1;                              // The destructor in A called 
                                          // The B destructor is not called. May cause problems (leaking).
                                          // The destructor in A is not virtual.

  cout << "Now end of f" << endl;
}  

int main(){
  e();
  cout << endl << endl;
  f();
}