Using this inside Base Class Constructor

Hi all ,

I was trying code to Implement a logic to know from which Class ( Out of many extended Classes ) , the base class constructor was called

// CODE SAMPLE 1



class Ext1 extends Base;
  
    
    function new();
      
    `ifdef THIS
      super.new(); 
    `else
      super.new(this); 
    `endif
      
   endfunction 
    
endclass  
  
 class Ext2 extends Base;
    

    function new();
      
    `ifdef THIS
      super.new(); 
    `else
      super.new(this); 
    `endif

   endfunction
    
endclass 
  
  
  class Base;
    

   `ifdef THIS
     function new();
   `else
     function new(Base b); // Ext Class Passed as Argument
   `endif
    
       Ext1 E1 ;
       Ext2 E2 ;
       Base B ;
    
    
    `ifdef THIS // To Use this as RHS of $cast
      if ( $cast(E1,this) )
    `else
      if ( $cast(E1,b) )  
    `endif  
        begin
          $display("Base Class Constructor Called from Ext1 Class Constructor");
        end 
    else 
      `ifdef THIS
         if  ( $cast(E2,this) )
      `else
         if ( $cast(E2,b) )  
      `endif  
         begin
           $display("Base Class Constructor Called from Ext2 Class Constructor");
         end
    else 
      `ifdef THIS
        if  ( $cast(B,this) )
      `else
         if ( $cast(B,b) )  
      `endif  
          begin
             $display("Base Class Constructor Called directly");  
          end
    

endfunction 
    
    
 endclass 
 
  
  Base b1;
  Ext1 e1;
  Ext2 e2;
  
 initial begin
  
  e1 = new();
  e2 = new();
  
 end


// Output without +define+THIS Simulator 1 :: 

Base Class Constructor Called directly
Base Class Constructor Called directly
                                                       
// Output without +define+THIS Simulator 2 ::

Base Class Constructor Called from Ext1 Class Constructor
Base Class Constructor Called from Ext2 Class Constructor

// Output WITH +define+THIS Simulator 1 :: 

Base Class Constructor Called directly
Base Class Constructor Called directly
                                                       
// Output WITH +define+THIS Simulator 2 ::

Base Class Constructor Called from Ext1 Class Constructor
Base Class Constructor Called from Ext2 Class Constructor


I was expecting Output of Simulator 2 in Both Cases ( with/without define ).

BUT now if I change the order of $cast() used inside Base Class Constructor to ::

// CODE SAMPLE 2



...  

class Base ;

`ifdef THIS
     function new();
   `else
     function new(Base b); // Ext Class Passed as Argument
   `endif
    
       Ext1 E1 ;
       Ext2 E2 ;
       Base B ;
    
    
    `ifdef THIS // To Use this as RHS of $cast
      if ( $cast(B,this) )  // THE ORDER HAS CHANGED FROM SAMPLE 1
    `else
      if ( $cast(B,b) )     // THE ORDER HAS CHANGED FROM SAMPLE 1
    `endif  
        begin
          $display("Base Class Constructor Called directly");  
        end 
    else 
      `ifdef THIS                
         if  ( $cast(E1,this) )  // THE ORDER HAS CHANGED FROM SAMPLE 1
      `else
         if ( $cast(E1,b) )      // THE ORDER HAS CHANGED FROM SAMPLE 1
      `endif  
         begin
          $display("Base Class Constructor Called from Ext1 Class Constructor");
         end
    else 
      `ifdef THIS
        if  ( $cast(E2,this) )    // THE ORDER HAS CHANGED FROM SAMPLE 1
      `else
         if ( $cast(E2,b) )       // THE ORDER HAS CHANGED FROM SAMPLE 1
      `endif  
          begin
           $display("Base Class Constructor Called from Ext2 Class Constructor");
          end
    

endfunction 

endclass


// Output without +define+THIS Simulator 1 :: 

Base Class Constructor Called directly
Base Class Constructor Called directly
                                                       
// Output without +define+THIS Simulator 2 ::

Base Class Constructor Called directly
Base Class Constructor Called directly

// Output WITH +define+THIS Simulator 1 :: 

Base Class Constructor Called directly
Base Class Constructor Called directly
                                                       
// Output WITH +define+THIS Simulator 2 ::

Base Class Constructor Called directly
Base Class Constructor Called directly



[Q1] What Causes the Output to differ in Sample 2 ? .
I was expecting Both Outputs of Simulator 2 in Sample 2 same as in Sample 1 i.e
" Base Class Constructor Called from Ext1 Class Constructor "
" Base Class Constructor Called from Ext2 Class Constructor "

Regards,
AGIS