读书人

将派生类对象传送给希望接受基类类型对

发布时间: 2013-07-16 22:38:04 作者: rapoo

将派生类对象传递给希望接受基类类型对象(非引用)的函数
比方说有个函数 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 里的.
[解决办法]
怎么会是一回事?
把一个子类对象赋值给一个父类对象会造成“对象切割”,即非父类的部分被阉割掉。
而传递一个引用则不会,而已引用传值根本不会调用父类的拷贝构造函数。
[解决办法]

引用:
Quote: 引用:

怎么会是一回事?
把一个子类对象赋值给一个父类对象会造成“对象切割”,即非父类的部分被阉割掉。
而传递一个引用则不会,而已引用传值根本不会调用父类的拷贝构造函数。


传递一个引用怎么不会调用父类拷贝构造函数??用一个派生类来直接初始化一个父类 这个是引用传递吧?会调用父类的拷贝构造函数吧??

#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);
}

[解决办法]
Base item(d);这个是用d对象去初始化item对象;
是会调用Base(const Base&)。
但跟引用传递没关系。

读书人网 >C++

热点推荐