https://stackoverflow.com/questions/274626/what-is-object-slicing
什么是对象切割(object slicing)?
切割的意思是说,你把一个子类对象赋给父类,那么相比父类,子类对象多出的成员会被丢弃掉。比如,
class A {
int foo;
};
class B : public A {
int bar;
};
B b;
A a = b;
赋给 a
后,b
里的 bar
就会被丢掉。
此外,当一个派生类对象通过值传递给基类对象,这个基类的拷贝构造函数将被调用,默认执行 memberwise copy。此时派生类的特性将被切割,只有基类相关操作。也就是说如果我们向上转型如果不用引用或指针,对象将被切割。这是也我们应该传引用或指针而不是传值的原因。
#include <iostream>
#include <cstdlib>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()" << endl;
}
Base(const Base& b)
{
cout << "Base(const Base&)" << endl;
}
virtual void fun()
{
cout << "Base fun()" << endl;
}
};
class Derived: public Base
{
public:
void fun()
{
cout << "Derived fun()" << endl;
}
};
void fun1(Base b)
{
b.fun();
}
void fun2(Base *b)
{
b->fun();
}
void fun3(Base &b)
{
b.fun();
}
int main()
{
Derived d;
fun1(d); // output:
// Base(const Base&)
// Base fun()
fun2(&d); // output:
// Derived fun()
fun3(d); // output:
// Derived fun()
return 0;
}