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()
вместо вызова B.m()
(в этом случае требуется динамическая привязка метода.)
или, если заменить B
на S
в определении f()
,
void f(S s){
S.m();
}
все еще работает, то есть f()
может работать как с B
, так и с S
, т. Е. Для "подтипа" требуется только, чтобы S
также имел метод m()
с такой же сигнатурой, что и B.m()
? (Этот случай не требует динамического связывания метода.)
Спасибо.