注册 登录
编程论坛 VC++/MFC

考考大家对虚函数的理解

yuccn 发布于 2011-03-25 21:57, 840 次点击
大家先认真想想下面程序输出是什么,再把程序运行一下。
如果答案和你想到的不一样,哪么要认真学习补下基础了。如果和你想到的答案一样,并且明白为什么,哪么你的功底还不错的。^_^
其实题目也很简单,只是大意就很容易出错。(注意,对面向对象理解不够可能导致你做对这题目)
///////////////////////////////////
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...
7 回复
#2
qq10235692232011-03-25 23:11
不太懂!
#3
lixingkai02011-03-26 09:20
请楼主讲解一下,按照main函数定义的对象Derive Obj;
按照隐藏这条规则应该只执行cout<<"Derive - print"<<endl;
为什么两条都执行??
#4
yuccn2011-03-26 10:59
回lixingkai0:你大意了。输出两条是肯定的,你没有看到基类析构的时候有个输出吗?呵呵。
#5
Pirelo2011-03-29 15:39
Derive - print //派生类虚函数
Base - print //基类虚函数
Base - print //基类析构函数

是上面的吗??
#6
yuccn2011-04-01 09:29
应该来总结下帖子了
例子的输出为:
Derive - print
Base - print

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

第二个输出,是在析构基类的时候,或许读者会迷惑,为什么析构基类没有调用了动态绑定的接口。这个就涉及到一个c++的很基础的知识了。因为pObj析构的时候,先是派生类的析构,再到基类的析构。再析构基类的时候,派生类已经析构完成了。故在析构基类的时候还想调用动态绑定的接口是不可以了的(因为派生类已经析构了),故调用了基类的接口。
#7
songhuirong12011-04-01 22:11
哈哈。我的结果跟lz的是一样的。
#8
westerngoat2011-04-04 15:24
有点意思维?
1