Как создать налогооблагаемую корректировку для позиции в Spree?

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

Функция virtual в C ++ определена (более или менее, без необходимости использования экстремальной языковой адвокации) как выполняемая на основе типа времени выполнения объекта; при вызове непосредственно на объект это всегда будет тип времени компиляции объекта, поэтому нет полиморфизма, когда функция virtual вызывается таким образом.

Обратите внимание, что это необязательно в том числе: типы объектов с функциями virtual обычно реализуются в C ++ с указателем на объект для таблицы функций virtual, которая уникальна для каждого типа. Если это так, компилятор для некоторого гипотетического варианта C ++ может реализовать назначение объектов (например, Base b; b = Derived()) как копирование как содержимого объекта, так и указателя таблицы virtual вместе с ним, что легко сработает, если оба Base и Derived были одинакового размера. В случае, если два не были одинакового размера, компилятор мог даже вставить код, который приостанавливает программу на какое-то время, чтобы переупорядочить память в программе и обновить все возможные ссылки на эту память таким образом, чтобы это могло быть доказал, что не имеет заметного влияния на семантику программы, заканчивая программу, если такая перестановка не может быть найдена: это было бы очень неэффективно, хотя и не могло быть гарантировано когда-либо остановить, очевидно, нежелательные функции для оператора присваивания имеют.

Таким образом, вместо вышеописанного полиморфизм в C ++ выполняется, позволяя ссылаться на ссылки и указатели на объекты и указывать на объекты их объявленных типов времени компиляции и любые их подтипы. Когда функция virtual вызывается посредством ссылки или указателя, и компилятор не может доказать, что объект, на который ссылается или указал, имеет тип времени выполнения с определенной известной реализацией этой функции virtual, компилятор вставляет код, который ищет правильную функцию virtual для вызова времени выполнения. Это не должно было быть так: ссылки и указатели могли быть определены как неполиморфные (запрещающие их ссылаться или указывать на подтипы их объявленных типов) и заставляя программиста придумать альтернативные способы реализации полиморфизма , Последнее очевидно, так как оно все время выполняется в C, но в этот момент нет оснований для того, чтобы иметь новый язык вообще.

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

0
задан Naman Wadhwa 17 January 2019 в 08:48
поделиться