Что такое параметрический и инклюзивный полиморфизм в 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, и я уверен, что многие другие имеют подобное.