В статически типизированном языке, таком как, например, C ++ или Java, static
может относиться к информации, известной во время компиляции, тогда как dynamic
относится к информации, известной во время выполнения.
Например:
struct Base { virtual std::string name() const { return "Base"; } };
struct Derived: Base { std::string name() const { return "Derived"; } };
void print(Base const& b) { std::cout << b.name() << "\n"; }
В методе print
тип static
для b
равен Base const&
.Поэтому компилятор проверит, что все вызываемые методы существуют в контексте Base
объекта.
Однако, когда приходит выполнение, вызов name
, поскольку метод является виртуальным, выполняется с учетомдля dynamic
типа объекта:
- это может быть
Base
- это может быть
Derived
- это может быть другой производный класс от
Base
, который мы еще не знаем
Поэтому в следующем примере:
int main(int argc, char* argv[]) {
if (argc == 1) {
Base base;
print();
} else {
Derived derived;
print(derived);
}
};
- Типы
static
и dynamic
base
Base
и derived
- это Derived
. - В методе
print
тип static
для b
равен Base
(всегда) - В зависимости отчисло аргументов,
dynamic
из b
равно Base
или Derived
В настоящее время ошибочно предполагать, что полиморфизм обязательно основан на динамическом распределении памяти, но двапонятия, хотя и не ортогональные, в некоторых условиях могут использоваться друг без друга.