zoukankan      html  css  js  c++  java
  • C#中类的继承 override virtual new的作用以及代码分析


    继承中override virtual new的作用


      virtual     父类中需要注明允许重写的方法;
      override   子类中必须显示声明该方法是重写的父类中的方法;
      new         子类中忽略父类的已存在的方法,“重写该方法“;
      
    C#中不支持隐式重写子类的方法


      即如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法(new),而不能覆盖(override);


    代码分析


    这是一个base类A有很多子类:
     1 class A
     2 {
     3     public virtual void Movie()
     4     {
     5         Console.WriteLine("MikiMouse");
     6     }
     7 }
     8 
     9 class B : A
    10 {
    11     public override void Movie()
    12     {
    13         Console.WriteLine("DisneyMovie");
    14     }
    15 }
    16 
    17 class C : B
    18 {
    19     public new virtual void Movie()
    20     {
    21         Console.WriteLine("Snow White");
    22     }
    23 }
    24 
    25 class D : C
    26 {
    27     public override void Movie()
    28     {
    29         Console.WriteLine("Seven Dwarfs");
    30     }
    31 }

    主函数其实也是一个静态(static)的入口函数:
     1 static void Main(string[] args)
     2 {
     3             A objA = new D();
     4             A objB = new B();
     5             C objC = new D();
     6             A objD = new A();
     7             objA.Movie();
     8             objB.Movie();
     9             objC.Movie();
    10             objD.Movie();
    11 }

    其中:

    A objA = new D();
    objA.Movie();

    这样用A定义的objA分配的是子类D的空间;

    调用Movie()时先看A中的Movie()是虚函数(virtual),所以看A的下一级B,B被override修饰;

    所以B中的Movie()覆盖A的函数,所以输出的应该是B中的DisneyMovie;

    同理最终输出如下:



  • 相关阅读:
    MXNet中bucket机制注记
    MXNet中LSTM例子注记
    Bellman update中Value Iteration收敛证明
    关于分类问题中的激活函数特性影响
    mxnet包含NDArray的列表更新
    FeatureMap Viewer以及中心化对统计分布变化的影响讨论
    [ufldl]Supervised Neural Networks
    【ufldl tutorial】Convolution and Pooling
    【ufldl tutorial】Softmax Regression
    【leetcode刷题笔记】Rotate Image
  • 原文地址:https://www.cnblogs.com/Elson8080/p/4378947.html
Copyright © 2011-2022 走看看