Что такое параметрический и полиморфизм включения в C ++ - PullRequest
9 голосов
/ 15 сентября 2011

Я читаю текст C ++ по адресу https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html.

В разделе UNIVERSAL POLYMORPHISM автор упомянул о Parametric и Inclusion полиморфизмах. Я не совсем уверен, что понимаю смысл, особенно почему Parametric полиморфизм реализуется во время компиляции, в то время как Inclusion полиморфизм реализуется во время выполнения?

Кто-нибудь может дать мне четкое объяснение или пример, пожалуйста?

Ответы [ 3 ]

9 голосов
/ 15 сентября 2011

" Параметрический полиморфизм " в C ++ означает шаблоны.

Я думаю, , что "полиморфное включение" в C ++ означает полиморфное, как его называет Стандарт: виртуальные методы, подклассы и т.

Я думаю, что имена неуклюжи и привкус академии.

3 голосов
/ 15 сентября 2011

Я думаю, что «Параметрический» относится к method/function overloading - мы можем определить, какой метод будет использоваться во время компиляции, посмотрев на тип данных его параметров.

А под «включением» это означаетmethod/function overriding - в отношении родительского подкласса, если родительский и дочерний класс имеют одну и ту же функцию, во время выполнения будет определяться (в зависимости от типа объекта), какой метод будет вызван.

1 голос
/ 15 сентября 2011

Я понял, что универсальный полиморфизм отличается от того, что мы ожидаем от C ++.C ++ является специальным полиморфизмом.

Universal говорит, что может быть только версия одной и той же сигнатуры, независимо от количества типов.

Я думаю, что другие ответы скользят по деталям, что параметрический иВключение являются категориями универсального.Учитывая оригинальный текст, я вижу, как они или я были сбиты с толку.;)

Учитывая следующее:

struct Foo {
  virtual void foo();
};

struct Bar {
  virtual void bar();
  // virtual void foo(); // this would error
};

Параметрический параметр будет выглядеть так:

struct FooBar : public Foo, public Bar {};

Подписи, содержащиеся в FooBar, статически определяются во время компиляции.

C ++ напрямую не поддерживает полиморфизм включения.Они были бы ближе к внедрению, которое вы можете найти в языках сценариев, где функции имеют первый порядок.

Пожалуйста, не воспринимайте этот код буквально, это просто для демонстрации.

struct FooBar {};

int main() {
  FooBar foob;
  foob.foo = Foo::foo;
  foob.bar = Bar::bar;
  return 0;
}

FooBar не знает своего интерфейса во время компиляции, он динамически создается.Я использовал подобное поведение в javascript и Lua, и я уверен, что многие другие имеют подобное.

...