Exercises in this lecture   Go to the notes, in which this exercise belongs -- Keyboard shortcut: 'u'   Alphabetic index   Course home   

Exercise solution:
Slicing an object during parameter passing.


In this variant of the program, the aB object from main is sliced already when it is passed to f. Therefore, x in f refers to an instance of class A. Both via y, z, and w, op() returns the value of a from clas A. Namely 3.

Here is my solution, with some comments:

// Class B inherits from A. Illustration of slicing.
// A minor variant of the previous program.

#include <iostream>
#include <string>

using namespace std;

class A {
public:
  int a;

  A(): a(3){
  }

  virtual int op(){
     cout << "A: operation" << endl;
     return a;
  }
};

class B: public A {
public:
  int b;

  B():  b(5){
  }

  int op(){
     cout << "B: operation" << endl;
     return b;
  }
};

int f(A x){        // Was   int f(B &x)   in the original version. Now the parameter is passed by value. Sliced during parameter passing.
  A  y = x,        
    *z = &x,       
    &w = x;        

  cout << y.op() << endl;    // 3.  A operation. y is an A object (sliced when passed to f).
  cout << z->op() << endl;   // 3.  z is a pointer to an instance of A.
  cout << w.op() << endl;    // 3.  z is a reference to an instance of A.
                             // So did anything change?   YES - A LOT 
}

int main(){
  B aB;
  f(aB);
}