Copying an extended class object

Hi,
I’m studying the book SystemVerilog for Verification by Chris Spear. I have a problem understanding one of the example.
Suppose we have the following class:

class Transaction;
    rand bit [31:0] src, dst, data[8]; // Variables
    bit [31:0] crc;

    virtual function Transaction copy;
        copy = new;
        copy.src = src; // Copy data fields
        copy.dst = dst;
        copy.data = data;
        copy.crc = crc;
    endfunction
endclass

Now we extend the class and use polymorphism to replace to copy function:

class BadTr extends Transaction;
    rand bit bad_crc;
    virtual function Transaction copy;
        BadTr bad;
        bad = new;
        bad.src = src; // Copy data fields
        bad.dst = dst;
        bad.data = data;
        bad.crc = crc;
        bad.bad_crc = bad_crc;
        return bad;
    endfunction
endclass : BadTr

Now, the return type of the copy function in the extended class must be the same as the parent class, namely, Transaction. This I understand. What confuses me is the ‘return bad;’ statement and the line above it. The return type of the copy in BadTr is Transaction, so when we return a handle of type BadTr, we are basically performing an upcasting. As far as I understand, after we do upcasting, the destination base handle will not be able to reference any of the properties which are specific to the child class. We simply lose them. If this is correct, then this copy function in BadTr would do nothing more than the original one in Transaction. Specifically, the statement ‘bad.bad_crc = bad_crc;’ will not result in the availability of bad_crc in the returned Transaction object of the copy function.
Would you please clarify on this?
Thank you very much in advance
Farhad

In reply to Farhad:

Incorrect. You do not lose them, you simply cannot reference them directly using the base variable. Any other virtual method in the extended class would be able to access bad_crc that you had copied.