Pure-Virtual functions (create and get_type_name) in uvm_object

From the source code of uvm_object.svh here : eda-playground/docs/_static/uvm-1.2/src/base/uvm_object.svh at master · edaplayground/eda-playground · GitHub
I see this comment about create and get_type_name being pure-virtual functions

However the function doesn’t have the keyword “pure” in the uvm_object.svh. I just see it as a virtual function.

#1 . Am I missing something in understanding of pure-virtual functions? Am I looking at the correct file ?

virtual function string get_type_name (); return “”; endfunction
virtual function uvm_object create (string name=“”); return null; endfunction

#2. Moreover I am able to successfully run a code where I extend from uvm_object directly and use the get_type_name without implementing it ? how does it work ?

The below code executes fine. The display function works as expected

`include “uvm_macros.svh”
import uvm_pkg::*;

class A extends uvm_object;
function new(string path = “”);
super.new(path);
display();
endfunction

function void display();
`uvm_info(get_type_name(),“Display function”,UVM_LOW)
endfunction
endclass

module tb;
initial begin
A a;
a = new();
end
endmodule