Требует ли понятие подтипа динамического связывания метода? - PullRequest
0 голосов
/ 07 июля 2019

https://en.wikipedia.org/wiki/Subtyping говорит

В теории языка программирования подтип (также полиморфизм подтипов или полиморфизм включения) является формой полиморфизма типов, в которой подтип является типом данных, который связан с другим типом данных (супертипом) некоторым понятием замещаемость , означающее, что программные элементы, обычно подпрограммы или функции, написанные для работы с элементами супертипа, также могут работать с элементами подтипа.

В понятии «подтип», при объяснении «заменяемости» как «программные элементы, обычно подпрограммы или функции, написанные для работы с элементами супертипа, могут также работать с элементами подтипа», предполагает ли он / требует ли он динамический привязка метода (например, указанная как виртуальные функции в C ++)?

В частности, для типа B с методом m(), функция

void f(B b){
    b.m();
}

и подтип S из B, который переопределяет метод m(), который означает, что S является подтипом B в соответствии со значением «замещаемости» в статье в википедии, означает:

  1. либо при вызове f() с экземпляром s, равным S, b.m() в f() будет вызывать S.m() вместо вызова B.m() (в этом случае требуется динамическая привязка метода.)
  2. или, если заменить B на S в определении f(),

    void f(S s){
        S.m();
    }
    

    все еще работает, то есть f() может работать как с B, так и с S, т. Е. Для "подтипа" требуется только, чтобы S также имел метод m() с такой же сигнатурой, что и B.m()? (Этот случай не требует динамического связывания метода.)

Спасибо.

...