基类和子类函数名相同且参数类型一样,基类函数如何被覆盖,还存在吗?存在何处?请详细回答,谢谢~~~~

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个私变量----------------------------

 

以上是关于基类和子类函数名相同且参数类型一样,基类函数如何被覆盖,还存在吗?存在何处?请详细回答,谢谢~~~~的主要内容,如果未能解决你的问题,请参考以下文章

java多态中父类和子类一定要有一样的方法名吗

java中基类和子类的类型是一样的吗?

C++多态总结

C++多态总结

C++之重载覆盖和隐藏

C++编程中 子类(派生类)能不能重写父类(基类)的函数(方法),除了虚函数?