将派生类对象传递给希望接受基类类型对象(非引用)的函数
比方说有个函数 void f(Base item) 现在对它进行调用 f(Derived d)
其中,Base为基类类型 Derived为派生类类型
Primer487-488说d的基类部分将会被复制到形参item
我的问题是:此处的复制将会调用Base的复制构造函数Base(const Base&)吗?
如果调用了 那么void f(Base item)和 void f(Base& item)不是一回事了吗?
[解决办法]
就算调用了, 也不是一回事.
Base item 是产生的一个新对象, 对象是 Base, 如果里面有虚函数的话, 所有的虚函数都是指向 Base 的函数的.
而 Base& item 不会复制, 对象还是 Dervied, 里面的虚函数还是用的 Dervied 的函数, Dervied 里没有的才是 Base 里的.
[解决办法]
怎么会是一回事?
把一个子类对象赋值给一个父类对象会造成“对象切割”,即非父类的部分被阉割掉。
而传递一个引用则不会,而已引用传值根本不会调用父类的拷贝构造函数。
[解决办法]
#include <iostream>
using namespace std;
class Base
{
public:
Base(){cout<< "Base()" <<endl;};
Base(const Base&){cout<< "Base(const Base&)" <<endl;}
};
class Derived:public Base
{
public:
Derived(){cout<< "Derived()" <<endl;};
Derived(const Derived&){cout<< "Derived(const Derived&)" <<endl;}
};
void funv(Base){}
void funr(Base&){}
int main()
{
Derived d;
cout<<"--- pass by value ---"<<endl;
funv(d);
cout<<"--- pass by reference ---"<<endl;
funr(d);
}