深入理解面向对象--多态

今天在看书的途中又遇到了这样的问题

 class Animal
    {
        
        public int AnimalProperty { get; set; }

        public void AnimalMethod()
        {
            
        }
    }
    class Dog : Animal
    {
        public bool DogProperty { get; set; }

        public void DogMethod()
        {

        }
    }
static void Main(string[] args)
        {
            Animal a = new Dog();
            a.AnimalMethod();
        }

之前也遇到过,但没有深入研究,今天又看到了,就不能再放过了,要彻底理解它。

为什么可以这样写:

 Animal a = new Dog();

这是不同的类型,为何可以这样赋值。

通过深入研究,小有收获,在这里分享给大家,那里有不妥的地方,欢迎大家一起探讨。

====================OK,进入研究阶段=====================

在C语言中,我们大家都学习过数据类型,数据类型可分为:值类型和引用类型。

值类型比较好理解,在这里就不多做解释,但是引用类型我们可以深入研究一下。

引用类型 由类型的实际值引用(类似于指针)表示的数据类型。如果为某个变量分配一个引用类型,则该变量将引用(或“指向”)原始值。不创建任何副本。引用类型包括类、接口、委托和装箱值类型。

从内存的角度来理解:引用类似于指针(同一系统中数据指针的大小是相等的,但跟函数指针的大小不一定相等),在内存栈上开辟一块空间,用于保存在内存堆上分配的对象空间的地址,即内存栈上有个指针,指向内存堆。内存堆中保存了我们创建的对象。

在内存栈上的保存的内容,其实仅仅是堆中内存块的地址而已。那么问题来了,既然仅仅存的是地址,那么这个指针为什么还要有类型呢?

原来,给指针定义的类型,是给它的偏移用的,计算机根据指针的类型来计算指针从内存堆上取出空间的大小。

这样一来,上面的那句话就好理解了,在内存堆上开辟一块Dog对象空间,这块空间里包含Dog对象,前面的部分空间存的是从父类继承来的内容,后半部分是自己类里有的内容,当Animal a=new Dog()时,指针偏移Animal大小,也就只能取到animal的内容;当Dog a=new Dog()时,指针偏移Dog大小,然后取到Dog的内容,取出来之后,就回到编译器了,然后编译器在做类型转换判断。

OK,搞定。

第一次写博客,有哪里不周到的地方,望大家指正。谢谢。

祝大家学习、工作愉快!

 

转载于:https://www.cnblogs.com/xiangcode/p/4428218.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值