Re: systemverilog的class继承问题
另外,你VCS/NC都跑过么
systemverilog根据tr指向的对象的类型而不是句柄本身的类型调用对应的方法。如果没有声明virtual方法,则根据句柄本身的类型来调用方法
你得了解oop里多态的概念
method加virtual才会打印后者
声明virtual这个我倒是知道。
我的疑问是,变量i在tr2 = new()的时候不就已经确定了么?执行tr1=tr2这一句的时候,应该只是把句柄tr1指向tr2所指向的memory空间,而那个memory空间里面放着的i的值是2.
当执行tr1.display的时候,调用的函数肯定是tr1的,但是我觉得i的值应该是2才对啊,因为tr1=tr2这句话没有重新分配空间,只是让tr1指向了tr2的那个对象。
多谢~~~
谁告诉你两个i一样了 t2继承了t1,所以t2也继承了t1的i,t2的i是t2自己的 两个i在t2中是两块不同的空间,你的函数没加virtual 打印的自然是基类的i
“两个i在t2中是两块不同的空间”
就是说,在t2指向的memory里面,实际上存放了两个i,一个是基类的,另外一个是派生类的?
我一直以为派生类的int i=2;把基类的int i=1覆盖了呢......原来是并存的关系,而不是覆盖的关系?
你应该先找本oop的书好好看看 new一个object的时候 先给父类成员分配空间 再给子类成员分配空间 所以你用父类指针指向一个子类object的时候访问的是父类成员
好文,建议斑竹mark一下这个帖子,我觉得我在OOP上也是一知半解啊
-----------------------------
| |
| ext |
| i |
| display() |
| |
| ---------------------- |
| |
| base |
| i |
| display() |
| |
-----------------------------
※ FROM: 101.69.72]
※ 来源:·水木社区 http://www.newsmth.net·[FROM: 101.69.72]
不好意思,恕本人愚钝,再请教一下:
按照你的说法,子类的对象所分配的空间里会保存两个i,而父类的对象只会存自己的一个i,那是不是说明子类的对象所占用的空间会大一些呢(包含两个i)?
可是我加代码试了一下,两个对象的大小是一样的。
tr1 = new;
tr2 = new;
size1 = $bits(tr1);
size2 = $bits(tr2);
$display("size1: %d\n",size1);
$display("size2: %d\n",size2);
输出是:
32
32
多谢指教!
你这样难道不是求的指针的大小吗?指针应该都是一样大的 多少个i都一样