IEEE Std 1800-2012 § 8,16 "Casting" stwierdza:
It zawsze dopuszczalne jest przypisywanie wyrażenia typu podklasy do zmiennej typu klasy wyższej w drzewie dziedziczenia (nadklasa lub element nadrzędny typu wyrażenia). Niedozwolone jest bezpośrednie przypisywanie zmiennej typu nadklasy do zmiennej jednego z jej typów podklas. Jednakże, można użyć $cast
do przyporządkowania uchwytu klasy nadklasy do zmiennej typu podklasy, pod warunkiem, że uchwyt nadklasy odnosi się do obiektu, który jest przypisaniem kompatybilnym z zmienną podklasy.
Następujące zaległości nie powiodły się, ponieważ obiekt nadklasy nie został odczytany jako klasa potomna.
m_base = new();
$cast(m_extend, m_base); // destination type != source object type
Aby rzucić poprawnie przedmiot uchwyt źródłowego muszą być zgodne z typetypes docelowe muszą być porównywalne:
m_extend = new();
m_base = m_extend;
$cast(m_extend, m_base); // destination type == source object type
rzutowanie w dół może pracować przez poziomy dziedziczenia. Poniższy przykład pokazuje uchwyt klasa bazowa wskazując obiekt wnuka być lanego do klasy rozszerzenia (klasa dominująca obiektu wnuka):
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
Oto niektóre z przykładów pracy: http://www.edaplayground.com/s/6/587
tak więc spuszczone działa tylko wtedy, gdy obiekt źródłowy został najpierw upcast. –
Tak, w przeważającej części. Nie musi to być wynikiem jawnego upcastu, ale powinieneś mieć odniesienie typu bazowego wskazujące na obiekt typu pochodnego. – dwikle