当前位置:网站首页>SV 类的虚方法 多态
SV 类的虚方法 多态
2022-08-05 00:13:00 【Bunny9__】
SV 类的虚方法 多态 类型转换
概述
- 类的成员方法可以加修饰词
virtual
(虚方法) - 虚方法是一种基本的多态结构
- 一个虚方法可以覆盖基类的同名方法
- 在父类和子类中声明虚方法,其方法名、参数名、参数方向都应该保持一致
- 在调用虚方法时,它将调用句柄指向对象的方法,而不受句柄类型的影响
class BasePacket;
int A = 1;
int B = 2;
function void printA;
$display("BasePacket::A is %d", A);
endfunction
virtual function void printB;
$display("BasePacket::B is %d", B);
endfunction
endclass
class My_Packet extends BasePacket;
int A = 3;
int B = 4;
function void printA;
$display("My_Packet::A is %d", A);
endfunction
virtual function void printB;
$display("My_Packet::B is %d", B);
endfunction
endclass
module tb;
BasePacket P1 = new();
My_Packet P2 = new();
initial begin
P1.printA; // A is 1
P1.printB; // B is 2
P1 = P2; // 子类句柄赋值给父类,父类句柄指向子类的对象
P1.printA; // A is 1
P1.printB; // B is 4
P2.printA; // A is 3
P2.printB; // B is 4
end
endmodule
父类句柄默认会查找调用父类方法,当子类句柄赋值给父类,父类句柄指向子类的对象后,父类句柄查找方法会扩大到子类里,如果子类里有同名方法,那么就会执行子类的同名方法。故P1.printB()
和P2.printB()
打印结果都是4。
virtual关键字的作用:虽然句柄类型不一样,但是调用函数会以子类的实现优先,即子类如果有同名方法就调用子类里的方法。
变量能不能也声明成virtual:不可以
- 人家都叫虚方法了,都没说虚变量诶
- 父类访问方法的范围可以扩展到子类,但是访问的变量范围只有父类变量范围
- 上述代码子类方法可以不用virtual声明,但是父类一定要声明
- 上述代码,父类不用virtual,子类用virtual,则不行,这样父类对象在查找方法时候,不知道要去子类找,只会在父类范围内查找
一些建议点:
- 类在封装的时候建议不要local、protected
- 类在继承的时候,为了方便以后访问到更多的变量,子类继承父类的时候尽量不要出现同名变量
边栏推荐
猜你喜欢
随机推荐
jenkins send mail system configuration
【Unity编译器扩展之进度条】
leetcode:269. 火星词典
10 种常见的BUG分类
建模师经验分享:模型学习方法
Modelers experience sharing: model study method
mysql基础
KT148A电子语音芯片ic方案适用的场景以及常见产品类型
The master teaches you the 3D real-time character production process, the game modeling process sharing
2022年华数杯数学建模
DNS常见资源记录类型详解
没有这些「伪需求」,产品经理的 KPI 怎么完成?
oracle创建用户以后的权限问题
KT148A语音芯片ic工作原理以及芯片的内部架构描述
Metasploit-域名上线隐藏IP
图解 Canvas 入门
matlab中rcosdesign函数升余弦滚降成型滤波器
LeetCode Hot 100
【LeetCode】Summary of Two Pointer Problems
如何写好测试用例