IEEE Std 1800-2012 § 8,16 "Кастинг" гласит:
It всегда легально назначать выражение типа подкласса переменной типа класса, более высокой в дереве наследования (суперкласс или предок типа выражения). Недопустимо прямое назначение переменной типа суперкласса переменной для одного из ее типов подкласса. Однако $cast
может использоваться для назначения дескриптора суперкласса переменной типа подкласса, если дескриптор суперкласса относится к объекту, который является присвоением, совместимым с переменной подкласса.
Следующие действия не выполняются, потому что объект суперкласса не читается как дочерний класс.
m_base = new();
$cast(m_extend, m_base); // destination type != source object type
Чтобы правильно преобразовать объект исходных ручек должна быть совместимы с typetypes назначения должен быть сопоставим:
m_extend = new();
m_base = m_extend;
$cast(m_extend, m_base); // destination type == source object type
понижающее приведение может работать через уровни наследования. Следующий пример демонстрирует базовый класс дескриптор указывает объект внучат быть отлиты в классе расширения (объекта внучки родительского класса):
class ext_more extends extend;
int c;
endclass
initial begin
base m_base;
extend m_extend;
ext_more m_ext_more;
m_ext_more = new();
m_base = m_ext_more;
$cast(m_extend, m_base); // legal, casting a subclass object to a parent handle
$display(m_extend.a);
end
Вот некоторые рабочий пример: http://www.edaplayground.com/s/6/587
Так, в опущенных работает только если исходный объект был сначала опрошен. –
Да по большей части. Это не должно быть результатом явного upcast, но вам нужно, чтобы ссылка базового типа указывала на объект производного типа. – dwikle