23_类型转换与虚方法

本文深入探讨了面向对象编程中的类型转换,包括静态与动态转换的差异,强调了动态转换中父类与子类句柄的使用规则。此外,还详细阐述了虚方法的概念,说明如何通过虚方法实现父类句柄调用子类的方法。内容涵盖了类型转换的正确实践以及虚方法在多层继承中的应用,对于理解和优化面向对象设计具有指导意义。
摘要由CSDN通过智能技术生成

1. 类型转换

在这里插入图片描述

  • real r = 4.0;int i;
  • int’(4.0)这是一个静态转换,编译的时候就生效。不知道是否转换成功
  • $cast(i,r)是动态转换

1.1 动态转换

在这里插入图片描述

  • 父类的句柄不可以直接转为子类,子类可以直接转为父类
    在这里插入图片描述
  • 父类的小三角不能拓展到子类大三角。
  • 只有借助$cast(h2,h1),才能将h1转换为h2,父类才可以转换为子类
  • 若h1/h2指向同一个子类对象,那么子类通过super可以找到父类中的同名变量,但是父类没有办法获得子类的对象。
  • 父类句柄h1即便是和子类句柄h2指向了同一个子类对象,但是h1的探照范围只是上面的小三角形。
    在这里插入图片描述
  • ABCD
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • A
    在这里插入图片描述
  • 直接将父类句柄给子类是错误的,tr指向的是小三角,没法再转换为指向大三角。
  • 但是子类对象句柄可以直接赋值给父类,但是父类句柄所指向的范围只是小三角。
    在这里插入图片描述
    在这里插入图片描述
  • $cast可以转换成功,二者都指向子类对象,但是作用范围不同。
    在这里插入图片描述
  • B。既然转换成功,那么BAD2就是指向子类对象,并且句柄本身也是子类的类型,因此作用范围是大三角。

2. 虚方法

在这里插入图片描述

  • 子类中有父类中的同名变量def,他也继承了父类的def。内存为他们开辟了不同空间,super.def就可以调用父类的def
  • 非虚方法,不同句柄类型指向同一个对象,通过不同句柄调用方法结果不同(调用了同名父子方法)。
  • 不期望父类指向子类对象,却调用父类的方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 代码中经常把子类的句柄赋值给父类。我们不期望经过赋值后,父类只能调用父类的方法,而是能调用子类的方法。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 不需要担心调用方法时用父子句柄调用子类对象,先看父类的方法,然后看父类句柄是不是虚方法,若子类中有同名方法,那就执行子类的,否则执行父类的。
    在这里插入图片描述
  • A B C,A是父类,B是次父类,C是子类。只有B中声明了虚方法,那么C句柄给A、B后,通过A的句柄只能调用A的方法,B句柄可以调用C方法。
  • 所以一般只在最底层的父类声明需方法。
    在这里插入图片描述
  • A
  • B:super.method()添加了意味着子类方法调用父类方法(继承),若没有super,那么两者没有任何关系。即便有虚方法,那也不会自动调用父类方法。
  • C:父类方法(task、function)之前可以添加virtual,但是没有虚成员变量(非法)。借助虚方法,父类句柄指向子类对象时候,只能调用父类的变量。唯一的办法就是父类句柄转换为子类句柄,这样才可以调用子类变量。
  • D:继承方法,满足4条件:同名、参数数目、参数种类,返回值类型相同,这时候才叫做方法继承。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值