vtable(虚函数表):
vptr(虚指针):
绑定关系:
vptr 与对象的实际类型绑定。例如:
class Base;
virtual function void display();
$display("Base");
endfunction
endclass
class Child extends Base;
function void display(); // 隐式 override
$display("Child");
endfunction
endclass
Base b = Child::new(); // vptr 指向 Child 的 vtable
此时 b.vptr 指向 Child 的 vtable,调用 b.display() 会执行 Child::display。
vptr 在对象构造时由构造函数隐式初始化,指向当前类对应的 vtable。
当通过基类指针或引用调用虚函数时,通过 vptr 找到 vtable,再通过 vtable 找到实际调用的函数地址(动态绑定)。
规则:
virtual,子类的同名函数自动成为虚函数,无论是否显式标记 virtual。override 关键字)。示例:
class Parent;
virtual function void display();
$display("Parent::display");
endfunction
endclass
class Child extends Parent;
function void display(); // 隐式虚函数,覆盖父类
$display("Child::display");
endfunction
endclass
Parent p = new Child; p.display(); 会输出 Child::display(动态绑定生效)。规则:
virtual,子类函数即使标记为 virtual,也不会触发动态绑定。示例:
class Parent;
function void display(); // 非虚函数
$display("Parent::display");
endfunction
endclass
class Child extends Parent;
virtual function void display(); // 新的虚函数,隐藏父类函数
$display("Child::display");
endfunction
endclass
Parent p = new Child; p.display(); 会输出 Parent::display(静态绑定)。Child 类型调用时才会使用子类的虚函数。virtual 标记基类需要多态的函数。override 关键字显式标记覆盖(避免误隐藏):class Child extends Parent;
function void display() override; // 明确意图
...
endfunction
endclass