Here is my solution:// 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, // The B object x is sliced: The B part is lost.
*z = &x, // No slicing. The B object is accessed via pointer.
&w = x; // No slicing. The B object is accessed via a reference.
cout << y.op() << endl; // 3. A operation. y has been sliced to an A object.
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);
}