当多态的处理对象时,传地址与传值有明显不同,如果使用对象而不是地址或引用进行向上映射,对象会被“切片”
如程序:
#include <iostream>
using namespace std;
class base
{
int i;
public:
base(int I = 0) : i(I){}
virtual int sum() const {return i;}
};
class derived : public base
{
int j;
public:
derived(int I = 0, int J = 0) : base(I), j(J){}
int sum() const
{
return base::sum() + j;
}
};
void call(base b)
{
cout << "sum = " << b.sum() << endl;
}
int main()
{
base b(10);
derived d(10, 17);
call(b);
call(d);
system("pause");
return 1;
}
1. call()接受的只是一个base对象,对call的任何调用都将引起一个与base大小相同的对象压栈并在调用后清除
2. 如果一个base的派生类对象传给call,编译器接受他,但只拷贝这个对象对应于base的部分,切除这个对象的派生类部分