多态置换原则

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部分。
原文地址:https://www.cnblogs.com/zhengzhe/p/6561693.html