本日来看一道海光的数字芯片设计的一道题。左边是程序的代码,希望能推算出来程序输出的结果是什么。
这上面是一个类,这个类叫a,a类也定义了三种方法,分别是show name、show h以及show name and h这三个函数。这三个函数里面有两个是虚函数,便是以virtual开头的虚函数。虚函数是可以被子类所重载的,子类是相称于可以来阐明函数的类部的东西的,或者说函数可以被子类重新定义。
b的答案便是a的词类该当是继续,从a继续下来的,也定义了3个同样的函数。再看看后面详细怎么用。利用的时候看一下,先是把b、b、b实体化的new出来做实体化,b直接把b的指针就输给了a,a再去调a的三个函数。

详细来剖析一下,这种利用办法的过程当中由于a并不是溜出来的,仅仅是把b的指针附给了a,因此在调a的第一个函数时候来看一下,手动正常来讲该当调这个函数是a这个类。
这个函数大家把稳,由于它是一个虚函数,虚函数是可以被子类所重载的,也便是虚函数由于多态性,被子类重载的时候实行的史上是这段函数。
·第一段是a,虽然表面上看是a里面的函数,但由于它是能被重载,以是身上掉的是BBB类里面的IMBB,它显示的是这句话,以是第一个该当是显示的这一句。
·第二段是h,一样的,回到a的里面是a的函数,由于这个函数并不是虚函数,就意味着函数不能够被重载,因此肯定就实行自己的函数体,因此它显示的该当是IM,我25岁,以是该当选的是这个。
·第三段函数,一样的,回到AA类里面来看,由于它也是虚函数,因此也可以被主宰,以是它实行的实际上是子类里面的虚函数。子类里面虚函数大家把稳,调的show name和showh,当然便是调到BB类里面的show h和show name,以是它该当实行的便是MBB和M18Z,该当是这样的,这个便是准确的输出的结果。
·第四段要把稳一下,对付这种函数的多态性实际上有个须要把稳的地方,便是把子类的实际化往后的差异或者叫指针附给到父类,然后才会涌现虚函数被重载、多态性这些事情。
但是如果不是这么赋值的,举个例子,比如在这个地方AA便是自己new出来的,并不是把AB的指针复过来便是自己扭出来,就跟虚函数多态性就毫无关系。大家把稳,由于AA是自己实例化出来的,以是跳的所有的函数都该当是自己的函数。
因此大家实际上可以想一下,如果是这样的一种情形,这种情形实际上实行的都是a里面的函数,以是实行结果就完备不一样了,就该当是Maa,y25岁MaaMaMa525岁,该当是实行的是这样的一句。
以是大家可以比较一下,这两段时尚差一点就在这,这个地方是把b的BB的指针复印到AA,这个地方是AA是独立实例化,独立new出来。以是这个须要把稳,纵然是虚函数想去重载它,要利用这种方法,否则是不能够实现多态性的。如果直接弄出来,肯定不能实现多态性。
实际上在systemverilog手册里面是有解释的,在systemverilog手册里面,实际上在它的7.19这一节,这个便是它的手册,iEEE是由于IEEE的标准手册。
在7点哀求这一节里面首先讲过virtual的函数,这个例子也非常的清楚,比如它有一个基位叫base package,然后在用定的一个子类叫ether packet,ether packet就继续到base packet。
当然还可以定义其他的类,比如像TOKEN packet、GPS packet都是从base packet继续来的。如果把它们三个都实例化完之后,再定义一个basepacket这样的数组,把子类的指针敷到数组的不同的元素上。它这个意思里面跟你讲packet的一点sent,也便是packet的点cent。
实际上它由于SCENT是一个虚的函数,在上面的地方看到它是一个virtual的函数,因此它可以被子类所重载。因此它实际上掉的是谁?SCENT实际上掉的是谁?是TOKEN packet里面的SCENT。
这个身上也便是语法书上,它把逻辑的实际上也做理解释,做了很清楚的阐明,以是跟之前看的这个题实在是一样的。当然大家如果对这个理解还是不足深入,也可以从代码侧面去看一下。
便是这个代码也可以在这个,可以把这个代码敲进来,敲进来之后可以实行一下看一下,看看是不是跟理论上是一样的。这个便是题里面它的依据,可以给它编一下,编一下再仿真一下看看。大家可以看到这个便是跟理论上是一样的。
学生也可以把什么?比如这个地方,如果不是用这个,是把它独立new出来,结果肯定就又不一样了。可以再编一下,绑定完之后再实行一下。大家可以看到这个时候调的这些就全是a这个类里面的函数,这个跟bb那个类就毫无关系的。由于a这个类是自己new出来的,自己实力化出来的,跟bb实在没有发生任何关系。
因此调的函数全是aa这个种别。以是关于多态性以及它的实现的方法还是须要把稳的,尤其是这两段之间的比较。
关于魔球这种特性,我们就讲到这里。