首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

将派生类对象传送给希望接受基类类型对象(非引用)的函数

2013-07-16 
将派生类对象传递给希望接受基类类型对象(非引用)的函数比方说有个函数 void f(Base item) 现在对它进行调

将派生类对象传递给希望接受基类类型对象(非引用)的函数
比方说有个函数 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&)。
但跟引用传递没关系。

热点排行