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()

时间: 2024-10-26 09:53:36

C# 函数覆盖总结学习的相关文章

C++多态篇2——虚函数表详解之从内存布局看函数重载,函数覆盖,函数隐藏

上一篇C++多态篇1一静态联编,动态联编.虚函数与虚函数表vtable中,我在最后分析了虚函数与虚函数表的内存布局,在下一篇详细剖析虚函数及虚函数表的过程中,我发现有关函数重载,函数覆盖,函数重写和函数协变的知识也要理解清楚才能对虚函数表在内存中的布局,对派生类的对象模型以及对多态的实现有更深的理解. 所以这一篇我作为一篇过渡篇,也同时对我以前写过的一篇博文进行一个收尾.在C++继承详解之二--派生类成员函数详解(函数隐藏.构造函数与兼容覆盖规则)文章中,我对函数覆盖,重载,重写提了一下,但是没

c 函数及指针学习 10

标准库函数 1算数运算stdlib.h 2随机数stdlib.h 3字符串转化stdlib.h 4数学函数 math.h 5日期和时间 time.h 6信号 signal.h 7打印可变参数列表stdarg.h 8断言 assert.h 抽象数据类型在数据结构中比较仔细 运行时环境没看 来自为知笔记(Wiz)c 函数及指针学习 10,码迷,mamicode.com

c 函数及指针学习 6

不完整声明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /* 方法一   */ struct tag_a{     struct tag_b *bp;  /* 这里struct tag_b 还没有定义,但编译器可以接受 */     int value; }; struct tag_b{     struct tag_a *ap;     int value; }; typedef struct tag

c 函数及指针学习 5

聚合数据类型 能够同时存储超过一个的单独数据. c语言提供了数组和结构体. 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> #include <math.h> void main() { struct {     int a;     }x,*b; int c[2]={1,2}; x.a=1; b=c; printf("%d \n",b[1]); printf("%d \n",x.

C函数及指针学习3

1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> void main() { char *sa="sdhshdh"; char *sb="cdehhhhsdssssd"; printf("%d , %d \n",strlen(sa),strlen(sb));    if(strlen(sa)-strlen(sb)>=0) {     printf("run 1\n&quo

Delphi Excel操作,写了个ADODataSet转Excel的函数作为后期学习的例子

使用该函数需要先Use Excel2010 //DataSet导出Excel2010格式//FileName=待导出的Excel的文件名,不带路径以及后缀:TitleLine1=导出后Excel第一表头,TitleLine2=Excel第二表头:CellsNames=Excel表格中Field的Title名称://IsOpen=是否马上打开 procedure sysDSetToXlsx(DSet: TADODataSet;FileName,TitleLine1,TitleLine2:Strin

c 函数及指针学习 7

1.结构的存储分配 1 2 printf("%d \n",sizeof(char)); printf("%d \n",sizeof(int)); int 类型为4B char 为1B 1 2 3 4 5 6 7 struct sa     {         char a;         int  b;         char c;     }; 1 2 3 4 5 6 7 8 struct sa     {         char c;         ch

c 函数及指针学习 8

联合体 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> union sa     {     double a;     int b;     }; int main() { union sa ssa; printf("%d \n",sizeof(union sa)); } 联合体的声明,定义,与结构体一样. 联合体的长度为最长成员的长度. 联合体的初始化 1 2 3 4 5 6 7 8 9 10 11 12 13 #inc

Javascript函数的简单学习 - &lt;转&gt; 博客园

Javascript函数的简单学习 函数的定义与调用1:函数的定义    语法格式    function 函数名(数据类型 参数1){//function是定义函数的关键字        方法体;//statements,用于实现函数功能的语句        [返回值return expression]//expression可选参数,用于返回函数值            }    //1:函数名:区分大小写,并且在同一个页面中,函数名是唯一的    //2:parameter:可选参数,用于