IEEE Std 1800-2012 § 8,16 "Casting", afferma:
E ' è sempre legale assegnare una espressione di tipo sottoclasse a una variabile di un tipo di classe più alta nell'albero di eredità (una superclasse o antenato del tipo di espressione). È illegale assegnare direttamente una variabile di un tipo di superclasse a una variabile di uno dei suoi tipi di sottoclasse. Tuttavia, è possibile utilizzare $cast
per assegnare un handle di superclasse a una variabile di un tipo di sottoclasse a condizione che l'handle della superclasse faccia riferimento a un oggetto compatibile con la variabile di sottoclasse.
Il cast seguente non funziona perché un oggetto superclasse non può essere letto come un childclass.
m_base = new();
$cast(m_extend, m_base); // destination type != source object type
di lanciare correttamente l'oggetto della maniglia sorgente deve essere compatibile con le typetypes destinazione devono essere comparabili:
m_extend = new();
m_base = m_extend;
$cast(m_extend, m_base); // destination type == source object type
downcasting può lavorare attraverso livelli di ereditarietà. L'esempio seguente mostra una maniglia classe base indicando un oggetto nipotino essere casted alla classe di estendere (classe genitore dell'oggetto nipote):
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
Ecco alcuni esempio di lavoro: http://www.edaplayground.com/s/6/587
Così le opere bassi solo se il l'oggetto di origine è stato trasmesso per primo. –
Sì per la maggior parte. Non è necessario che sia il risultato di un upcast esplicito, ma è necessario che il riferimento di tipo base indichi un oggetto del tipo derivato. – dwikle