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条件:同名、参数数目、参数种类,返回值类型相同,这时候才叫做方法继承。