zoukankan      html  css  js  c++  java
  • 面向对象高级5.3

    本周我们围绕多态来进行的学习,所谓多态就是指同一操作作用于不同的对象,会产生不同的结果。多态可以使程序变得更加灵活,从而有效提高程序的可扩展性和可维护性。实现多态的方式有很多种,重写就是其中的一种。其中有一个知识点:动态绑定。所谓动态绑定就是把派生类的对象,地址赋给基类的引用变量。

    * 多态存在的三个必要条件:

    1.多态以继承为基础--继承。

    2.按照契约形成另一种形态(特殊性)--重写。

    3.父类引用指向子类对象--使用时“动态绑定”。

    * 多态的内在实现机制:

    1.编译器为每一个含virtual关键字的方法构建--Vtrl--虚函数表--存储每个虚方法的首址。

    2.派生类如果改写了(override)方法,则派生类的Vtrl--虚函数表--的虚方法首址将改变,指向新的已经被override的新方法。

    3.动态绑定时,基类的对象引用它绑定的是那个派生类的对象,那么这个基类引用对象就将引用那个派生类的override方法。

    重写父类方法时,要求子类的方法名,参数类型和参数个数必须与父类方法相同,而且父类方法必须使用virtual关键字修饰,子类方法必须使用override关键字修饰,被virtual关键字修饰的方法称为虚方法。

    base关键字是基类的引用,它专门用于在子类中访问父类的成员。它不但可以调用父类的字段和方法,还可以调用父类的构造方法。在c#中可以使用一个父类类型的变量来引用一个子类类型的对象,即将子类对象当作父类类型来使用,这就是所谓的里氏转换原则。这也说明了在继承关系中当子类对象赋值给父类变量的情况下,父类变量也可以通过强制转换指向子类变量。与其相关的还有is和as关键字,它们都可以用来判断父类对象是否指向子类,as关键字除了判断以外,还有直接转换功能。如果判断成功就直接进行类型转换,如果判断失败就返回null。在c#中还提供了一个Object类,它是所有类的父类,即每个类都直接或间接继承自该类。

  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/mwt63/p/10707163.html
Copyright © 2011-2022 走看看