您的位置:首页 > 职场人生

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

2008-03-22 00:26 363 查看
本博客(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也已被正确初始化,因此虚析构函数在实现上是可能的。

从设计任务来看,析构函数的任务是释放内存,因此它必须知道被释放的对象的类型,否则可能破坏有用的数据,产生不可预知的后果。如用基类的指针指向了派生类对象,那么释放内存时,必须是释放派生类对象的存储空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐