基类和子类函数名相同且参数类型一样,基类函数如何被覆盖,还存在吗?存在何处?请详细回答,谢谢~~~~
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基类和子类函数名相同且参数类型一样,基类函数如何被覆盖,还存在吗?存在何处?请详细回答,谢谢~~~~相关的知识,希望对你有一定的参考价值。
基类加上virtual关键字就能够被覆盖~基类当然是存在的,只不过变成了虚函数,作为一个可以被类似于模型的东西存在。与他相似的子类在调用时,自动覆盖基类版本。就相当于调用子类的同时已经调用了基类,但是只占用子类的空间~ 参考技术A 如果这个函数是一般的成员函数,不是虚函数的话,这种情况属于隐藏。这时候派生类在调用这个函数的时候,是看不到基类函数的,基类函数被隐藏。一般的成员函数在实现的时候都会被命名重整,函数名称会包含类、参数类型等信息。但是如果这个函数是虚函数的话,这个叫做重写。对应的是多态这个概念。实际在实现的时候要用到虚函数指针和虚函数表。在基类指针或者是引用调用虚函数的时候,要动态绑定。本回答被提问者和网友采纳 参考技术B 肯定存在啊,你定义一个基类的对象或者,指针,引用,直接可以调用它在基类的这个成员函数。 参考技术C 虚函数表里面
C#的构造函数在基类和父类中执行顺序
C#的构造函数在基类和父类中执行顺序
一、简介
当我们没有在子类构造函数中写上 base(),默认会先调用父类中无参的构造函数,再调用子类。
当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数。
二、代码案例
父类代码:
#region 父类 /// <summary> /// 测试构造函数——需要被构造类 Fu /// </summary> class Fu { private int x;//一个简单的私有字段 /// <summary> /// 构造函数 /// </summary> public Fu() { Console.WriteLine("会先调用这里:这是父类"); } /// <summary> /// 父类中的有参构造方法 /// </summary> /// <param name="x"></param> public Fu(int x) { this.x = x; Console.WriteLine("x赋值完成"); } /// <summary> /// 父类构造C函数 /// </summary> /// <param name="x"></param> /// <param name="b"></param> /// <param name="c"></param> public Fu(int x, int b, string c) { this.x = x; Console.WriteLine("x赋值完成" + x + b + c); } /// <summary> /// 具有7个参数的构造函数 /// </summary> /// <param name="a"></param> /// <param name="a1"></param> /// <param name="a2"></param> /// <param name="a3"></param> /// <param name="a4"></param> /// <param name="a6"></param> /// <param name="a5"></param> public Fu(int a, int a1, int a2, int a3, int a4, int a6, int a5) { Console.WriteLine("最长参数构造运行"); Console.WriteLine(a + "|" + a1 + "|" + a2 + "|" + a3 + "|" + a4 + "|" + a5 + "|" + a6 + "|"); //在函数中让传入参数对Fu类对象进行初始化 //例如有如下多个私有字段,在类对象初始化的时候,对其变量初始化。用构造函数最为简单 this.a = a; //传入参数,在对象实例化后,对其私有变量进行赋值操作 this.a1 = a; this.a2 = a; this.a3 = a; this.a4 = a; this.a5 = a; this.a6 = a; } private int a; private int a1; private int a2; private int a3; private int a4; private int a5; private int a6; } #endregion
子类代码:
#region 子类 /// <summary> /// 派生类继承父类 /// </summary> class Derived : Fu { /// <summary> /// 会先调用父类的构造函数,然后再调用子类这边的有参构造函数 /// </summary> //先调用父类无参,再调用子类无参
//当我们没有在子类构造函数中写上 base(),默认会先调用父类中无参的构造函数,再调用子类。
public Derived() //: base() //重新构造 :调用父类中无参的构造函数,在这里写不写调用结果一致 { Console.WriteLine("这是派生类-无参-构造函数"); } private int y; /// <summary> /// 构造函数 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// 当我们没有在子类构造函数中 写上 base(),默认会先调用父类中无参的构造函数 /// 当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数 public Derived(int x, int y) /*: base(x)*/ { this.y = y; Console.WriteLine("这是y赋值完成"); } /// <summary> /// 多参数 /// </summary> /// <param name="x"></param> /// <param name="a"></param> public Derived(int x, string a)// : base(x, x, x, x, x, x, x) //这里写了 base 会先调用父类,再调用当前子类进行构造 { y = x; Console.WriteLine(a + "第三方法"); } } #endregion
Main()调用:
#region Main 入口 /// <summary> /// 程序 /// </summary> class Program { /// <summary> /// 主入口 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Derived d = new Derived(); Console.WriteLine("-----------------------以上为无参构造------------------------------------------"); Derived d1 = new Derived(1, 2); Console.WriteLine("-----------------------以上为2个参数构造---------------------------------------"); Derived d2 = new Derived(1, "1"); Console.WriteLine("-----------------------以上为2个参数构造,6个私变量----------------------------"); //先调用有参的构造函数一旦被调用,无参的构造函数都不会被调用了 //先执行父类的构造函数,才执行子类的 Console.ReadLine(); } } #endregion
三、输出结果
会先调用这里:这是父类
这是派生类-无参-构造函数
-----------------------以上为无参构造------------------------------------------
会先调用这里:这是父类
这是y赋值完成
-----------------------以上为2个参数构造---------------------------------------
最长参数构造运行
1|1|1|1|1|1|1|
1第三方法
-----------------------以上为2个参数构造,6个私变量----------------------------
以上是关于基类和子类函数名相同且参数类型一样,基类函数如何被覆盖,还存在吗?存在何处?请详细回答,谢谢~~~~的主要内容,如果未能解决你的问题,请参考以下文章