Object Slicing in C++

In C++, a derived class object can be assigned to base class, but the other way is not possible.

class Base {
	int x,y;
};

class Derived : public Base {
	int z, w;
};

int main() {
	Derived d;
	Base b = d;
}

Object slicing happens when a derived class object assigned to base class, additional attributes of derived class is sliced off to form base class.

#include <iostream>
using namespace std;

class Base {
	protected:
		int i;
	public:
		Base(int a) {
			i = a;
		}
		virtual void display() {
			cout << "I am Base class object, i = " << i << endl;
		}
};

class Derived : public Base {
	int j;
public:
	Derived(int a, int b) : Base(a) {
		j = b;
	}
	virtual void display() {
		cout << "I am Derived class object, i = " << i << ", j = " << j << endl;
	}
};

void somefunc(Base obj) {
	obj.display();
}

int main() {
	Base b(33);
	Derived d(45, 54);
	somefunc(b);
	somefunc(d);
	return 0;
}

Output

  I am Base class object, i = 33

  I am Derived class object, i = 45

We can avoid such unexpected behavior with the use of pointer or reference. Object slicing won't happen if we set the function arguments to pointer or reference because all pointer or reference have same amount memory

we can avoid object slicing by writing like this

void somefunc(Base *obj) {
	...
}
void somefunc(Base &obj) {
	...
}

from http://www.geeksforgeeks.org/object-slicing-in-c/

原文地址:https://www.cnblogs.com/xinsheng/p/3502008.html