zoukankan      html  css  js  c++  java
  • new和override修饰符的区别

            前几日回复了一个网友的帖子,是关于new和override修饰符的区别,初看时发现自己也甚为模糊,msdn上的描述甚至也不能令人完全明确其区别,但于使用上并无大碍。简单的描述:
           virtual:虚方法。可从父类继承也可以子类实现自己的个性,也就是OO三大特性中的多态。调用那个函数属于运行时决定。
           new:隐藏了父类的virtual方法,默认调用自身实现的方法,但是可以显示的指定调用父类方法。函数同名时的默认行为。
           override:覆盖了父类的方法,只能调用自身的方法。
           abstract:抽象方法(或者类),即本身不包含实现,非抽象子类必须override它。可以指定一个方法为abstract来强制子类去实现它。
           overload:通过参数列表来确定调用同名方法而已,这个应该编译时就能确定的了。

    Code

    例如以上代码,override时,只能输出自身方法,而new时,可以使用父类类型调用其父方法。上面代码的结果为:
    ---------------------------------------------------------------
        ba_c1:  (overrided) C1.myF1     //override:  父类方法已被重写
        c1_c1:  (overrided) C1.myF1
        ba_c2:  Base.F1                         //new:  可以显示调用父类方法
        c2_c2:  (new) C2.newF1
    --------------------------------------------------------------------------

    例如一个矢量图形显示模块中,定义了各种类型的MapObject,即数据是用MapObjectCollection来组织的,这是调用集合中每个元素的Draw方法时,则每个元素应该override父类的draw方法才能实现正确的绘制。
    ------------------------------
    另一则,关于接口,Interface,曾经有位同事为我接口在哪(在内存中占据何处),接口只是一种规约,协议(编译器可以理解它),怎么可能有实例呢?所以接口也不可能有构造函数,如果有那就是具体对象和具体类了。它好比规定一些对象应该具有那些属性,哪些行为,而协议何来数据,没有数据又怎么可能在内存中占据位置呢?指定了接口来声明一个对象,相当于就可以确定你想调用这个对象的哪一个方法或者成员变量。曾经很久以前看过一篇“我是谁”的关于接口的帖子,还引用了成龙的电影也是令人很.....,一个对象是什么取决于你用那个类的构造函数构造了它,和你用什么类型的声明或者什么类型的指针并没有关系。例如句柄也是指针,它指向的实际的结构,但操作系统为了封装数据,把它强转为了指向一个空结构的指针。一个对象和它的父类的关系是“is a”。和接口的关系是“满足”或者“符合”,你可以指针类型转换为别的类型,但是它是什么取决于new 后面的那个构造函数。
  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/hoodlum1980/p/1056404.html
Copyright © 2011-2022 走看看