引用和传值 有关问题,为啥传值多出来delete

引用和传值 问题,为啥传值多出来delete
// Person 类
class CPersion
{
public:
CPersion(void);
~CPersion(void);
};

CPersion::CPersion(void)
{
cout<<"creat a person"<<endl;
}


CPersion::~CPersion(void)
{
cout<<"delete a person"<<endl;
}

// Student 类
class CStudent : public CPersion
{
public:
CStudent(void);
~CStudent(void);
};

CStudent::CStudent(void)
{
cout<<"creat a student"<<endl;
}


CStudent::~CStudent(void)
{
cout<<"delete a student"<<endl;
}

// main func

bool IsAStudent(CStudent s)
{
return false;
}

void main()
{
CStudent s = CStudent();
IsAStudent(s);

}

使用VS2010,为什么上面输出的是
creat a person
creat a student
delete a student
delete a person
delete a student
delete a person


而如果传的是引用
bool IsAStudent(CStudent& s)
{
return false;
}
输出的是
creat a person
creat a student
delete a student
delete a person

问题是为什么多出来
delete a student
delete a person
谁能帮解释一下???

------解决方案--------------------
引用:
这个我理解,但是问题是
1. 如果我定义了基类和派生类的拷贝构造函数的话
为什么它调用基类的构造函数,却调用了派生类的 拷贝构造函数?

2. 如果不定义基类和派生的拷贝构造函数的话
为什么它又没有调用基类的构造函数?

1、首先你本来就是要调用派生类的构造函数,其次基类的构造函数要优先于派生类的构造函数,所以当你调用拷贝函数时,会出现基类的构造函数。还有,你写的拷贝函数并没有要求拷贝基类,所以只是简单的拷贝派生类本身的信息,因此调用的是基类的普通构造函数,而不是基类的复制构造函数。

2、当你不定义派生类的拷贝函数时,调用的是系统默认的拷贝函数,这时系统会调用基类的拷贝构造函数,所以你看到它没有调用基类的构造函数。你可以把派生类的拷贝构造函数去掉,只留下基类的拷贝构造函数,打印结果就会是这样:
creat a person
creat a student
copy a person
delete a student
delete a person
delete a student
delete a person

所以关键还是你自己写的拷贝函数有问题,编译器不会主动帮你拷贝父类。如果你自定义的拷贝构造函数没有要求拷贝父类,编译器是不会越俎代庖的..