面试题目(3)——虚函数和非虚函数的调用

本博客( http://blog.csdn.net/livelylittlefish )贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
                       
                       

考查虚函数和非虚函数的调用 

                            
                  
写出如下程序的运行结果:
#include  " iostream.h "

class  CBase
{
public:
    
virtual void act1()    {cout<<"CBase::act1()! ";    act2();}
    
void act2()        {cout<<"CBase::act2()! ";    act3();}
    
virtual void act3()    {cout<<"CBase::act3()! ";    act4();}
    
virtual void act4()    {cout<<"CBase::act4()! ";    act5();}
    
void act5()        {cout<<"CBase::act5()! ";    }
}
;

class  CDerive : public  CBase
{
public:
    
void act3()    {cout<<"CDerive::act3()! ";        act4();}
    
void act4()    {cout<<"CDerive::act4()! ";        act5();}    //此处的act5()调用CDerive类的act5
    void act5()    {cout<<"CDerive::act5()! ";        }
}
;

void  main( void )
{
    CBase 
*pObj1=new CBase;
    pObj1
->act1();    //act5()不是虚函数,此处为静态绑定,调用CBase类的act5()
    pObj1->act5();
    cout
<<endl;
    CBase 
*pObj2=new CDerive;
    pObj2
->act1();
    pObj2
->act5();    //act5()不是虚函数,此处为静态绑定,调用CBase类的act5()
    delete pObj1;
    delete pObj2;
}
                         
                       
运行结果如下:
                 
CBase::act1()!
CBase::act2()!
CBase::act3()!
CBase::act4()!
CBase::act5()!
CBase::act5()!
                                           
CBase::act1()!
CBase::act2()!
CDerive::act3()!
CDerive::act4()!
CDerive::act5()!
CBase::act5()!
                             
                             

总结说明:

               
                                         
        在面向对象的概念中,多态性是指不同对象收到相同消息时,根据对象类不同产生不同的动作。多态性提供了把接口与实现分开的另一种方法,提高了代码的组织性和可读性,使软件的可扩充性有充分的提高。
                     
虚函数与重载设计方法上有何相同和区别:
                       
(1)重载函数依赖静态联编,根据函数参数数目和种类的不同调用不同的函数体;虚函数依赖动态联编,根据类对象指针类型确定正确的类版本调用;
(2)重载函数之间和虚函数之间的返回类型必须是一样的;
(3)构造函数可以为重载函数,不能为虚函数;析构函数应该为虚函数;
(4)重载函数出现在一个类定义体中;虚函数出现在不同版本的派生类中。
                              
虚析构函数设计对运行时的多态性处理的作用:
                    
        析构函数应该是虚函数。与一般的成员函数一样,析构函数被调用时,对象的构造已经完成,VPTR和VTABLE也已被正确初始化,因此虚析构函数在实现上是可能的。
                        
        从设计任务来看,析构函数的任务是释放内存,因此它必须知道被释放的对象的类型,否则可能破坏有用的数据,产生不可预知的后果。如用基类的指针指向了派生类对象,那么释放内存时,必须是释放派生类对象的存储空间。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值