C#基础 11 继承 虚成员virtual+overeide 与 new

继承:

继承(以及封装和多态性)是面向对象的编程的三个主要特征之一。

通过继承,可以创建重用、扩展和修改在其他类中定义的行为的新类。

其成员被继承的类称为“基类/父类/超类”,继承这些成员的类称为“派生类/子类/次类”。

继承语法格式:

访问修饰符 class 派生类名:基类名
{

   派生类主体(是父类写父类主体  子类写子类主体)

}

继承的特性:

1.可传递性         2.单一性       3.访问修饰符

C#基础 11 继承 虚成员virtual+overeide 与 new

    class Profession                    //父类
    {
        public string Zy = "资源";
        private int Rs = 60;
        public virtual void FF()
        {
            Console.WriteLine("头");
        }  
        
    }
    class Zhanshi: Profession          //子类
    {
        public string Wuqi = "刀";
        private string GJ = "物理攻击";
        public override void FF()
        {
            Console.WriteLine("牙");
        }
    }
    class Fashi: Zhanshi                          //子类
    {
        public string Wuqi = "法杖";
        private string GJ = "魔法攻击";
        public override void FF()
        {
            Console.WriteLine("脸");
        }
    }

 

    class Program
    {
        static void Main(string[] args)
        {
            //new     声明哪个  输出哪个 构造不起决定性作用  
            //virtual+override 构造哪个  输出哪个  声明不起决定性作用    
            

            Profession profession = new Profession();      //声明父类  构造父类
            //Zhanshi zhanshi = new Zhanshi();             //声明子类 构造子类
            //Fashi fashi = new Fashi();            //声明子类  构造子类
            Profession fashi1 = new Fashi();                //声明父类  构造子类
            profession.FF();fashi1.FF();            //
            Console.ReadKey();
        }
    }

虚成员virtual

重写父类中的成员,用virtual修饰;子类中对应override修饰。

1、字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的

2、无论在子类和最初声明虚拟成员的类之间已声明多少个类,虚拟成员都将永远为虚拟成员;

3、如果类A声明了一个虚拟成员,类B从类A派生,类C从类B派生 则类C继承该虚拟成员,并且可以选择重写它,而不管类B是否为该成员声明了重写。

    class Profession                    //父类A
    {
        public string Zy = "资源";
        private int Rs = 60;
        public virtual void FF()          //声明虚拟成员
        {
            Console.WriteLine("头");
        }     
    }
    class Zhanshi: Profession          //子类B
    {
        public string Wuqi = "刀";
        private string GJ = "物理攻击";
        public override void FF()          //声明虚拟成员

        {
            Console.WriteLine("牙");
        }
    }
    class Fashi: Zhanshi                          //子类下的子类C
    {
        public string Wuqi = "法杖";
        private string GJ = "魔法攻击";
        public override void FF()          //声明虚拟成员
        {
            Console.WriteLine("牙");
        }
    }
            Profession PA = new Profession();//声明父类  构造父类
            Zhanshi PB = new Zhanshi();
            Fashi PC = new Fashi();
            PA.FF();PB.FF();PC.FF();         //输出
            Console.ReadKey();

virtual+override和new区别

new                               声明哪个  输出哪个 构造不起决定性作用  
virtual+override           构造哪个  输出哪个  声明不起决定性作用  

例如:下面代码用virtual+override    声明父类   构造子类  但是输出依然是子类中的虚拟成员

Profession fashi1 = new Fashi();     //声明父类  构造子类
fashi1.FF();构造子类  输出子类

Profession profession = new Profession(); //声明父类  构造父类
profession.FF(); 构造父类  输出父类中的虚拟成员

使用new时   声明父类  构造父类  输出父类/    声明子类   构造子类   输出子类

使用virtual+override时   声明父类  构造父类   输出父类/声明父类  构造子类   输出子类