| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1276 人关注过本帖, 2 人收藏
标题:考考大家对虚函数的理解
只看楼主 加入收藏
jery2487
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2010-12-24
收藏
得分:0 
以下是引用yuccn在2011-3-29 21:52:30的发言:

应该来总结下帖子了
例子的输出为:
Derive - print
Base - print

第一个输出是 pObj->print();因为虚函数的动态绑定,而调用了派生类的接口。

第二个输出,是在析构基类的时候,或许读者会迷惑,为什么析构基类没有调用了动态绑定的接口。这个就涉及到一个c++的很基础的知识了。因为pObj析构的时候,先是派生类的析构,再到基类的析构。再析构基类的时候,派生类已经析构完成了。故在析构基类的时候还想调用动态绑定的接口是不可以了的(因为派生类已经析构了),故调用了基类的接口。
我错了,如果是代码~Derive(){}改成~Derive(){ Base *p=new Derive; p->print();delete p; }结果是:  Derive - print
                        Derive - print
                        Base - print
                        Base - print
如果是静态联编,那么第二行应该是Base-print,但实际上是在运行时确定调用派生类虚函数,其实书上所说的构造函数和析构函数调用虚函数是静态联编,不怎么严谨,我想应该是被逼无奈的动态联编,事实上是在运行是确定的,但没办法,对象初始化时,要先初始化基类成员,只能调用基类的虚函数,而当对象销毁时,要先撤销派生类成员的内存空间,所以等到执行基类析构函数,调用虚函数时,只剩下基类的虚函数。要多实践,学习!
2011-04-06 19:43
weststreet
Rank: 2
等 级:论坛游民
帖 子:21
专家分:18
注 册:2011-2-9
收藏
得分:0 
Derive-print
2011-04-07 13:25
wkhs198
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-4-7
收藏
得分:0 
请问第一次执行     pObj->print();时,为什么没使用 Derive中print(int i = 2)中的i值 而确是 Base中的i值
2011-04-07 19:46
wkhs198
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-4-7
收藏
得分:0 
调试后的结果为 :   Derive - print 1
                    Base - print 1
                    Derive - print 2
                    Base - print 2
                    Base - print 1
为何 第一次  调用pObj->print()的时候 未使用Derive中的print(int i = 2)中默认值?却使用了Base中的print(int i =1)中的i值?
2011-04-07 19:51
myseemylife
Rank: 2
等 级:论坛游民
帖 子:100
专家分:58
注 册:2009-3-22
收藏
得分:0 
void OutPrint(Base *pObj)
{
    pObj->print();
}

void main()
{
    Derive Obj;
    OutPrint(&Obj);   
}
这里 &obj是一个Derive类型的,函数参数是base*类型的,这之间是怎么转换的,进入print这个函数后。pObj是base*,还是Derive*,
 有这个过程么?pobj = (Base *)(&obj),

唔紸縡唔自己の鉎銘.................
2011-04-24 22:25
哈利波特隐
Rank: 1
等 级:新手上路
帖 子:21
专家分:3
注 册:2011-4-25
收藏
得分:0 
都搞不懂啊,刚来,希望能在这取到经
2011-04-25 23:56
快速回复:考考大家对虚函数的理解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038746 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved