| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1276 人关注过本帖, 2 人收藏
标题:考考大家对虚函数的理解
只看楼主 加入收藏
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
结帖率:99.13%
收藏(2)
 问题点数:0 回复次数:15 
考考大家对虚函数的理解
大家先认真想想下面程序输出是什么,再把程序运行一下。
如果答案和你想到的不一样,哪么要认真学习补下基础了。如果和你想到的答案一样,并且明白为什么,哪么你的功底还不错的。^_^
其实题目也很简单,只是大意就很容易出错。(注意,对面向对象理解不够可能导致你做对这题目)
///////////////////////////////////
class Base
{
public:
    Base(){}
    ~Base()
   {
        print();
    }

    virtual void print()
    {
        cout<<"Base - print"<<endl;
    }
};

class Derive : public Base
{
public:
    Derive(){}
    ~Derive(){}
    virtual void print()
   {
        cout<<"Derive - print"<<endl;
    }
};

void OutPrint(Base *pObj)
{
    pObj->print();
}

void main()
{
    Derive Obj;
    OutPrint(&Obj);   
}
////////////////////////////////////
有什么好的题目,希望网友拿出来分享o(∩_∩)o...哈哈


[ 本帖最后由 yuccn 于 2011-3-25 21:55 编辑 ]
搜索更多相关主题的帖子: 虚函数 答案 
2011-03-25 21:53
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
在原来的基础上改动一下,增加一个知识点、
程序代码:
class Base
{
public:
    Base(){}
    ~Base() 
    {
        print();
    }

    virtual void print(int i=1)
    {
        cout<<"Base - print"<<' '<<i<<endl;
    }
};

class Derive : public Base 
{
public:
    Derive(){}
    ~Derive(){}
    virtual void print(int i=2)
    {
        cout<<"Derive - print"<<' '<<i<<endl;   
        Base::print(i);
    }
};

void OutPrint(Base *pObj)
{
    pObj->print();
}

void main()
{
    Derive Obj;
    OutPrint(&Obj);
}



[ 本帖最后由 玩出来的代码 于 2011-3-26 12:05 编辑 ]

离恨恰如春草,更行更远还生。
2011-03-26 12:04
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
楼上增加了一个输出,想增加的知识点是什么?
只是在派生类多输出了一条基类的信息,还有时间一个默认参数,没有什么知识点的增加吧。这不属于面向对象的内容。

如果说有知识点的增加,请赐教

[ 本帖最后由 yuccn 于 2011-3-26 13:10 编辑 ]

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2011-03-26 13:04
buffer
Rank: 5Rank: 5
等 级:职业侠客
帖 子:73
专家分:326
注 册:2010-12-31
收藏
得分:0 
还有一个小知识点
程序代码:
class Base
{
public:
    Base(){}
    ~Base() 
    {
        print();
    }

    virtual void print(int i=1)
    {
        cout<<"Base - print"<<' '<<i<<endl;
    }
};

class Derive : public Base 
{
public:
    Derive(){}
    ~Derive(){print();}
    virtual void print(int i=2)
    {
        cout<<"Derive - print"<<' '<<i<<endl;   
        Base::print(i);
    }
};

void OutPrint(Base *pObj)
{
    pObj->print();
}

void main()
{
    Derive Obj;
    OutPrint(&Obj);
}
2011-03-26 16:14
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
增加输出才能看到效果,只是说明了虚函数的动态绑定与参数的静态绑定。

离恨恰如春草,更行更远还生。
2011-03-26 16:35
linzhiqing
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-3-28
收藏
得分:0 
这个知识挺经典的
2011-03-29 08:32
神左手
Rank: 2
等 级:论坛游民
帖 子:46
专家分:62
注 册:2010-4-24
收藏
得分:0 
确实要注意基础知识!
2011-03-29 20:34
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
应该来总结下帖子了
例子的输出为:
Derive - print
Base - print

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

第二个输出,是在析构基类的时候,或许读者会迷惑,为什么析构基类没有调用了动态绑定的接口。这个就涉及到一个c++的很基础的知识了。因为pObj析构的时候,先是派生类的析构,再到基类的析构。再析构基类的时候,派生类已经析构完成了。故在析构基类的时候还想调用动态绑定的接口是不可以了的(因为派生类已经析构了),故调用了基类的接口。


我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2011-03-29 21:52
lixinyuan224
Rank: 2
等 级:论坛游民
帖 子:28
专家分:28
注 册:2010-7-25
收藏
得分:0 
才学,不懂,观望!大神多啊……
2011-04-03 19:24
jery2487
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2010-12-24
收藏
得分:0 
第一行是动态联编,第二行是静态联编,析构函数调用虚函数是在编译时确定的,所以要调用基类虚函数而不是派生类的
2011-04-06 18:57
快速回复:考考大家对虚函数的理解
数据加载中...
 
   



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

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