面向对象之父类变量指向子类实例对象分析

父类

public class person
    {

        
        public static string markup;

        static person()
        {
            markup = "markup";
        }
        //无参数构造函数
        //public person()
        //{
        //    Console.WriteLine("调用person构造函数");
        //}
        public person(int parage, string paraname, string parahobby)
        {
            age = parage;
            name = paraname;
            hobby = parahobby;
        }

        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private string hobby;

        public string Hobby { get; set; }

        public void SayHi()
        {
            Console.WriteLine("Person SayHi Method");
        }


    }

子类

    public  class Student:person
    {

        public string No;

        //调用无参构造函数,同时调用有参数构造函数的方式
        public Student():base(123,"sdf","sd")
        {
            Console.WriteLine("调用Student的无参数构造函数");
        }
        public Student(string s):this()
        {
            Console.WriteLine("调用Student的有参数构造函数");
        }
        public void SayHi()
        {
            Console.WriteLine("大家好,我是{0},{1},{2}", this.Name, this.Age, this.Hobby);
        }

        
    }

 person stu = new Student("ss");

1、父类变量可以指向子类的实例对象,反之则不可以。

2、当创建一个子类对象时,如果是它的父类变量接收的它的子类对象,那么它只能调用父类的成员;(此过程中,此父类变量指向了父类成员,并没有指向这个子类成员);

3、例外情况:通过重写(override),父类变量可以调用子类的重写方法; 

4、子类继承父类的所有成员,但是只能访问父类的非私有成员;

Student onestu = new Student("ss");

1、当创建一个子类对象时,如果声明的变量也是子类类型;调用时,首先查找子类中是否有该成员,有则调用;如果没有,到它的父类中寻找,有则调用

person stu = new Student("ss");
Student onestu = (Student)stu;
onestu.SayHi();

1、强制类型转换成子类,重新指向子类的实例对象

原文地址:https://www.cnblogs.com/mingjia/p/4557109.html