1 bool PrintMaillingLabel(const TPerson& aPerson) 2 { 3 TString name = aPerson.GetName(); 4 TString addr = aPerson.GetAddress(); 5 //打印邮件标签的代码 6 } 7 8 TStudent aStudentObject("Lassie", 423435063, "09-24-69", "Disney Land", eFullTime, eArts); 9 PrintMaillingLabel(aStudentObject);
虽然PrintMaillngLabel函数要一个TPerson类对象,我们仍然可以传递TPerson的派生类对象给它,因为任何TPerson的派生类都is-a(“是一个”)TPerson。
1 void main() 2 { 3 //创建一个TStudent类对象 4 TStudent aStudent("Lassie", 423435063, "09-24-69", "Disney Land", eFullTime, eArts); 5 6 //创建一个对TPerson的引用,并用TStudent初始化它 7 TPerson& rp = aStudent; 8 9 //在堆上创建一个TStudent类对象,并在pp中储存它的地址 10 TPerson *pp = new TStudent("Mickey", 423995063, "07-22-65", "Disney Land", eFullTime, eArts); 11 TPerson aPerson("Phantom", 123555032, "1-1-1970", "Fantasy World"); 12 13 //尝试将aStudent对象赋值给aPerson类对象 14 aPerson = aStudent; 15 }
aPerson = aStudent;
这行代码看起来很奇怪,但是正确赋值。
aPerson将会赋值为aStudent的aPerson的部分
aStudent的TPerson部分将复制到对象aPerson中。逻辑效果是,aStudent对象的顶部被切掉,并放入对象aPerson内。称为切断。
这种行为非常少见。程序员必须小心,不要被切断的效果所影响。注意,对象aStudent没有任何变化--它仍然是完美无缺的。
当参数按引用或者按指针的方式传递时,不好发生切断。原始对象不会被复制(或切断),但是,被调函数只能访问实参的TPerson部分。