读书人

virtual的疑问解决方法

发布时间: 2012-03-16 16:34:56 作者: rapoo

virtual的疑问
如果我有3个类
Grandpa
father
child
他们的关系是 爸爸继承爷爷 孩子继承爸爸
分别拥有函数eat()( 我把爸爸的eat()设为虚函数 )
则 child hai;
Grandpa* gptr = &hai;
gptr -> eat();
最后调用的应该是爷爷的eat还是孩子的eat呢?

[解决办法]
调用child的eat()。虚函数无论怎样调用,都会调用实际对象的那个。如果实际对象未override父类的虚函数,那么就调用实际对象父类的,以此类推。
[解决办法]
你的Grandpa类的eat是虚函数吗?如果是的话,调用的就是child类的eat,否则调用的是Grandpa类的eat函数。
[解决办法]
你说只有爸爸的是虚函数,所以调用的是爷爷的
[解决办法]
virtual 具有遗产性 如果爸爸的eat()方法是 virtual, 那么 儿子的eat()也是virtual的 反之则不然

爷爷的eat()不是虚的 gptr -> eat(); 调用编译时即可确定 因为gptr的静态类型是爷爷 所以调用的是爷爷的eat()

读书人网 >C++

热点推荐