• C# 虚方法(virtual)覆盖(override) 隐藏(new) 重载


    C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载

     

    &x6211;&x8981;&x5566;&x514D;&x8D39;&x7EDF;&x8BA1;

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;

    namespace AppTest
    {
        class Demo_virtual
        {
            static void Main(string[] args)
            {
                ////普通,这里的 virtual 作用就跟重写一样了
                //Student student = new Student();
                //Teacher teacher = new Teacher();
                //student.SetHeight(170, 20);
                //teacher.SetHeight(170, 20);

                //Console.WriteLine("Student's height is: {0}, age is {1}", student.Getheight(), student.Getage());
                //Console.WriteLine("Teacher's height is: {0}, age is {1}", teacher.Getheight(), teacher.Getage());


                //体现 virtual 方法,多态
                People people;

                //age只是隐藏,所以这里两个输出都是一样
                people = new Student();
                people.SetHeight(170, 20);
                Console.WriteLine("people1's height is: {0}, age is {1}", people.Getheight(), people.Getage());

                people = new Teacher();
                people.SetHeight(170, 20);
                Console.WriteLine("people2's height is: {0}, age is {1}", people.Getheight(), people.Getage());


                Thread.Sleep(3 * 1000);//暂停3秒看结果
            }
        }

        class People
        {
            public int height;
            public int age;

            public void SetHeight(int h, int a)
            {
                height = h;
                age = a;
            }

            //virtual方法
            public virtual int Getheight()
            {
                return height;
            }

            //一般方法
            public int Getage()
            {
                return age;
            }
        }

        //学生
        class Student:People
        {
            /*覆盖(override):只能使用"override"关键字来覆盖(override)父类中标记为
             * "virtual"、"abstract"或"override"的方法;
             * 而子类中标记为override的方法,
             * 也必须是父类中标记为"virtual"、"abstract"或"override"的方法。
             */
            public override int Getheight()
            {
                return height + 5;
            }

            /*隐藏(hide):在子类中创建与父类中的方法具有相同签名
             *(相同的方法名,相同的参数列表-参数类型和次序)
             * 的方法(可以带有"virtual"或"override"关键字)即可实现,
             * 但建议使用"new"关键字,以明确地隐藏。
             */
            public new int Getage()
            {
                return age + 5;
            }

            /*重载(overload):不需要任何特殊的关键字
             * 相同的方法名,返回值可以同可以不同
             * 参数类型或次序必须有不完全相同,即至少有一项不同
             */
            public int Getage(int addAge)
            {
                return age + addAge;
            }
        }

        //老师
        class Teacher : People
        {

        }
    }

    /*重载,覆盖,隐藏之间的区别
    *
         重载(overload)用于同一类中的成员函数,其特征为:
         * 1)在同一类中
         * 2)相同的函数名
         * 3)参数不同(包括参数类型不同,或参数个数不同,或两者都不同,注意:和返回值没关系)
         * 4)和是否虚函数无关
         覆盖(override)是指派生类函数覆盖基类函数,其特征为:
         * 1)不同的范围(分别位于派生类与基类)
         * 2)相同的函数名称
         * 3)参数相同
         * 4)基类函数必须是虚函数
         隐藏(hide)是指派生类的函数屏蔽了与其同名的基类函数,其特征为:
         * 1)不同的范围(分别位于派生类与基类)
         * 2)相同的函数名
         (3)若参数不同,基类函数无virtual关键字,基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载);
        ()若参数不同,基类函数有virtual关键字。基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载;因为参数不同,所以是隐藏而不是覆盖);
        ()若参数相同,基类函数无virtual关键字。基类函数将会被隐藏。(因为基类函数不是虚函数,所以是隐藏而不是覆盖)。
        ()若参数相同,基类函数有virtual关键字。如果基类函数有多个重载版本,且派生类并没有重写所有的同名虚函数,当在派生类中调用函数时,基类中未被重写的虚函数将被隐藏。(当然,被重写的函数就是覆盖了)。

    * 注意: 如果想在派生类中调用基类中的被隐藏的函数,可以在派生类中填写如下代码:using Base::Fun2

  • 相关阅读:
    C++文件流操作与流缓冲重定向
    转减小编译时间的两种做法
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    一个游戏程序员的资料一(转)
    ACE的Doublecheckedlocking的Singleton
    Hibernate 过滤器
    悲观锁 HibernateTest.java
    HQL 语句
    HQL 查询语句
    Hibernate 中继承映射之三 每一个类一个表
  • 原文地址:https://www.cnblogs.com/eastday/p/1688193.html
Copyright © 2020-2023  润新知