Что такое параметрический и инклюзивный полиморфизм в C++

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

Учитывая ниже:

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, и я уверен, что многие другие имеют подобное.

Другие вопросы по тегам