#include<iostream.h>
class a {
public:
int b;
virtual int get()
{
cout<<"a::get()";
return b;}
};
class c :public a
{
public:
int d;
int add()
{
return d+7;
}
int get()
{
cout<<"c::get()";
return d;}
};
/*void fun(a &www)//第一版本
{
cout<<www.get();
}*/
void fun( a www)//第二版本
{
cout<<www.get();
}
int main()
{
a *pa;
c cc;
pa=&cc;//很正常
cout<<pa->get()<<endl;//调用了c类的函数
c* pc;
a aa;
pc=(c*)&aa;//会出现数据丢失!即发生类的“切割”问题!这句强制转换
cout<<pc->get()<<endl;//调用了a类的函数
cout<<pc->add()<<endl;//此句会出错!?虽然pc是指向a对象,但是他却成功的调用了c中的add();这是为何?
fun(cc);//使用第一 版本就调用c,使用第二版本就调用a
fun(aa);//使用第一版本就调用a,使用第二版本就调用a
return 0;
}
//以上代码我用vc6编译!
//我觉得你举的例子好象也没证明是对象切割,更多的是关于一些多态。类的对象作为参数的传递到函数的时候会调用拷贝构造函数,对象切割更多的是发生在拷贝构造函数的调用中?
//请lifanxi(Byron)明示例!!