前面的道理我都懂,什么pass-by-value会调用赋值构造函数和析构函数,成本高,而pass-by-reference-to-const可以回避构造和析构。
后面提到by-reference方式传递参数也可以避免sliding(对象切割)问题。 ~~~等等,对象切割是什么鬼,effective C++果然有100种方式让我看不下去。
1.对象切割
首先我自己举个简单的例子,说明:
#include <iostream>
#include <cstdlib>
using namespace std;
class Base
{
public:
virtual void fun()
{
cout << "Base fun() is Called" << endl;
}
};
class Derived :public Base
{
public:
void fun()
{
cout << "Derived fun() is Called" << 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);
fun2(&d);
fun3(d);
system("pause");
return 0;
}
上面的第一个pass-by-value就是发生了切割,当把一个继承类对象赋给基类对象时,继承类对象的特化性质全被切割掉了,仅仅留下一个base-class对象。
所以,要实现虚函数的多态性,需要用指针和地址来传递,对象的转换引起切割,不能实现多态。