0. 介绍
sv中引入了OPP(面向对象),也会有类似于C++里的override和overload考虑,目前sv不支持class的overload。
1. override(重写)
override分为数据成员override和方法override。
父类句柄指向的数据成员永远是父类的成员。
如果通过父类句柄调用子类中重写的成员函数,那么需要将父类中成员函数定义成virtual类型。
2. virtual method(虚方法)
带有虚方法的类称为多态类。
- 类中的方法在定义的时候可以通过添加virtual关键字来声明一个虚方法,virtual method是一个基本的多态性结构。
- virtual method为具体的实现提供了一个原型,也就是在派生类中,重写该方法的时候必须采用一直的参数和返回类型。
- virtual method可以重写基类中所有的方法,但是普通的方法被重写后只能在本身及其派生类中有效。
- 每个类的继承关系中只有一个虚方法的实现,是在最后一个派生类中。
- 在P1指向P2后,当P1.printA被调用时,程序会调用访问内存中类对象P2中的P1部分,而此时发现printA是一个普通方法,因此直接调用并结束访问。
- 在P1指向P2后,当P1.printB被调用时,程序同样找到类对象P2中的P1部分,此时发现printB是virtual method(虚方法),这是程序会查看这个P2在定义的时候是否重写了该方法,如果重写程序就会直接调用P2重写的实现,否则调用基类中的PrintB。
注:对一个virtual函数,被调用时是由这个指针指向的对象的决定,而不是指针的类型决定;非virtual函数被调用时,则是由指针类型决定的。