zoukankan      html  css  js  c++  java
  • C# 函数覆盖总结学习

    覆盖类成员:通过new关键字修饰虚函数表示覆盖该虚函数。
    一个虚函数被覆盖后,任何父类变量都不能访问该虚函数的具体实现。
    public virtual void IntroduceMyself(){...}//父类虚函数
    public new void IntroduceMyself(){...}//子类覆盖父类虚函数

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MethodOverrideByNew
    {
        public enum Genders { 
            Female=0,
            Male=1
        }
        public class Person {
            protected string _name;
            protected int _age;
            protected Genders _gender;
            /// <summary>
            /// 父类构造函数
            /// </summary>
            public Person() {
                this._name = "DefaultName";
                this._age = 23;
                this._gender = Genders.Male;
            }
            /// <summary>
            /// 定义虚函数IntroduceMyself()
            /// </summary>
            public virtual void IntroduceMyself() {
                System.Console.WriteLine("Person.IntroduceMyself()");
            }
            /// <summary>
            /// 定义虚函数PrintName()
            /// </summary>
            public virtual void PrintName() {
                System.Console.WriteLine("Person.PrintName()");
            }
        }
        public class ChinesePerson :Person{
            /// <summary>
            /// 子类构造函数,指明从父类无参构造函数调用起
            /// </summary>
            public ChinesePerson() :base(){
                this._name = "DefaultChineseName";
            }
            /// <summary>
            /// 覆盖父类方法IntroduceMyself,使用new关键字修饰虚函数
            /// </summary>
            public new void IntroduceMyself() {
                System.Console.WriteLine("ChinesePerson.IntroduceMyself()");
            }
            /// <summary>
            /// 重载父类方法PrintName,使用override关键字修饰虚函数
            /// </summary>
            public override void PrintName(){
                System.Console.WriteLine("ChinesePerson.PrintName()");            
            }
        }

        class Program
        {
            static void Main(string[] args)
            {
                //定义两个对象,一个父类对象,一个子类对象
                Person aPerson = new ChinesePerson();
                ChinesePerson cnPerson = new ChinesePerson();
                //调用覆盖的方法,父类对象不能调用子类覆盖过的方法,只能调用自身的虚函数方法
                aPerson.IntroduceMyself();      
                cnPerson.IntroduceMyself();
                //调用重载方法,父类对象和子类对象都可以调用子类重载过后的方法
                aPerson.PrintName();
                cnPerson.PrintName();

                System.Console.ReadLine();
            }
        }
    }

    结果:
    Person.IntroduceMyself()
    ChinesePerson.IntroduceMyself()
    ChinesePerson.PrintName()
    ChinesePerson.PrintName()
  • 相关阅读:
    VC++界面编程个性化你的工具栏图标(转)
    C/C++指令 #undef ,#ifdef, #ifndef,#if的用法(转)
    为自定义工具栏按钮添加消息响应函数
    VC++深入详解:函数的重载 (转)
    NP和P问题
    How To Compile A Kernel The Ubuntu Way
    【转】关闭对话框,OnClose和OnCancel MFC中屏蔽ESC和回车关闭对话框
    MFC学习笔记之ClassWizard
    《c专家编程》学习笔记一
    <转>C语言中的文件输入输出函数
  • 原文地址:https://www.cnblogs.com/gc2013/p/3860113.html
Copyright © 2011-2022 走看看