zoukankan      html  css  js  c++  java
  • 多态置换原则

    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部分。
  • 相关阅读:
    使用echo $? 查看命令成功执行的原理
    Ubuntu 12.04下NFS安装配置图解
    使用nfsstat命令查看NFS服务器状态
    ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)
    toad调用存储过程,存储过程调用sql 类
    指纹协查统计sql
    oracle 解锁表
    【转】经典排序算法
    wget 命令用法详解
    Linux 带宽、CPU、内存占用情况
  • 原文地址:https://www.cnblogs.com/zhengzhe/p/6561693.html
Copyright © 2011-2022 走看看