https://en.wikipedia.org/wiki/Subtyping说
在编程语言理论中,子类型化(也称为子类型多态性或包含性多态性)是类型多态性的一种形式,其中子类型是通过某种概念与另一个数据类型(超类型)相关的数据类型可替换性的含义,这意味着编写为对超类型的元素进行操作的程序元素(通常是子例程或函数)也可以对子类型的元素进行操作。
在“子类型”的概念中,当将“可替换性”解释为“编写为对超类型的元素进行操作的程序元素(通常是子例程或函数)也可以对子类型的元素进行操作”时,它是否假定/要求动态方法绑定(例如,在C ++中指定为虚拟函数的方法)?
具体来说,给定类型为B
且带有方法m()
的函数
void f(B b){
b.m();
}
和S
的子类型B
,它重新定义了m()
方法,根据“可替换性”的含义,S
是B
的子类型维基百科文章中的意思是:
f()
的实例s
调用S
,则b.m()
中的f()
将调用S.m()
而不是调用{{ 1}},(这种情况下需要动态方法绑定。),或者在B.m()
的定义中将B
替换为S
f()
仍然工作,即void f(S s){
S.m();
}
可以与f()
和B
一起使用,即“子类型”仅要求S
也具有方法S
与m()
相同的签名? (这种情况不需要动态方法绑定。)