#include <iostream>  // cout, endl
#include <cstdlib>   // EXIT_SUCCESS

using std::cout;
using std::endl;

class A {
 public:
  void M1() { cout << "a1, "; }
  virtual void M2() { cout << "a2"; }
};

class B : public A {
 public:
  void M1() { cout << "b1, "; }
  void M2() { cout << "b2"; }
};

int main(int argc, char** argv) {
  A a;
  B b;
  A* a_ptr_a = &a;
  A* a_ptr_b = &b;
  // B* ba_ptr = &a;  // compiler error
  B* b_ptr_b = &b;

  a_ptr_a->M1();
  a_ptr_a->M2();
  cout << endl;
  a_ptr_b->M1();
  a_ptr_b->M2();
  cout << endl;
  b_ptr_b->M1();
  b_ptr_b->M2();
  cout << endl;

  return EXIT_SUCCESS;
}