记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数居然不太肯定,因此仍是理解的不深入,因此想经过这篇文章来巩固下。ios
装逼一刻:windows
最近,本人思想发生了巨大的转变,在大学的时候因为读书少,常常写一些玩具程序而沾沾自喜,总之一句话,那时写程序纯粹是为了写程序而写程序。然而,做为大部分的学习者来讲,每每忽略了学习开发语言的本质。即C++语言的设计思想也是以服务生产生活为主的,总结成一句话就是C++是实用的。咱们在学习这门语言的一些特性的时候,上来就开始直接去记忆或者揣摩这些特性的自己每每不是一个很好的学习方法。ide
当你弄明白了这个特性是为了解决什么问题而设计的时候,在现实中有那些应用的时候,再去结合理解这些特性就会很容易理解的更深入,更难忘。函数
同时,写程序也同样,做为一个之前上来就开始写程序的人深深以为之前的本身很愚蠢。哪怕你去写一个很简单的接口函数,都要去尽可能的想,这个程序的参数多是有那些人经过那些操做来传递的,他们可能出现的误操做是那些?若是出现了误操做该怎么去处理?当想清楚了这一切再去写函数。(想的多的人,每每比上来蛮干的人,要牛x的多。)学习
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------spa
so,既然装了那么多逼,那么为何要设计虚函数这个概念呢!.net
谈到这里,不得不谈下多态,有人常常会问什么是多态?其实,多态简单的说就是不一样的对象受到相同的刺激而产生的不一样反应。最直接明了的例子就是在windows平台下,你双击不一样类型的文件,会调用不一样的关联软件去打开同样。好比,点击word类型文件,系统会调用word来打开,点击一个.mp4文件,快播就默默的蹦出来了。因此,这就是多态,一个相同的动做,遇到不一样的对象产生不一样的反应,就是这么一致和高效。设计
可能有人会说了我擦,这特么不太正常了吗!点击不一样的文件,出现不一样的反应在人类来看这也许就是天经地义的事情,并无什么呀!但是做为一门语言想要达到这样的效果,仍是须要一番深思熟虑的考虑以及巧妙的设计,固然这些人都是顶级的计算机专家了。他们为了解决这些咱们人类逻辑看来天经地义的事情而设计了虚函数。指针
从某种程度上来说,虚函数是为实现多态而存在的。code
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
show code:
接下来就到了咱们最喜欢的show code环节:为了方便理解,仍然举双击文件的例子。
咱们假设这里有三个类,分别是 基类 - CFile 派生类 - CMovie 派生类 - CMusic 。三个派生类分别表明,电影文件 音乐文件 。
假如这些文件都有一个接受双击后的函数反应,定义为Clicked。
所以有了下面简单的代码:
1 /********************************************************************** 2 programe: butter know virtual function 3 auther: heat nan 4 data: 2015.8.19 5 mail: 964465194@qq.com 6 ************************************************************************/ 7 8 #include<iostream> 9 using namespace std; 10 class CFile 11 { 12 public: 13 CFile() 14 { 15 } 16 virtual void Clicked() 17 { 18 cout<<"I am doing nothing!"<<endl; 19 } 20 }; 21 class CMovie:public CFile 22 { 23 public: 24 CMovie() 25 { 26 cout<<"My name is wujiandao!"<<endl; 27 } 28 void Clicked() 29 { 30 cout<<"Video type,KuaiBo will running!"<<endl; 31 } 32 }; 33 class CMusic:public CFile 34 { 35 public: 36 CMusic() 37 { 38 cout<<"My name is the fox!"<<endl; 39 } 40 void Clicked() 41 { 42 cout<<"Music type,Kugou will running!"<<endl; 43 } 44 }; 45 int main() 46 { 47 CFile A; 48 CMovie W; 49 CMusic F; 50 51 CFile *ptr=&A; 52 53 ptr=&W; 54 ptr->Clicked(); 55 56 ptr=&F; 57 ptr->Clicked(); 58 return 0; 59 }
有了上面,如此简单粗暴的例子,以及一个很直观的多态例子,相信对为何要虚函数,以及引入虚函数作什么就很清楚了。
其实上面这个简单的例子我以为就能够这样理解,ptr这个指针呢,就能够理解为双击操做,固然实时状况并非这样,这里只是简化理解,当这个指针操做不一样类型的文件时产生不一样的反应。那么,不用Clicked函数不声明为虚函数能够吗?答案是否认的。不信能够试试。
必定要明白一件事情:虚函数不是为何有这样的功能,而是人们为了实现某种特定的功能而去设计的虚函数的一些特性和功能。
————————————————————————————————————————————————————————————————————————————
PS:虚函数的一些细节问题:
1 注意到继承类中的Clicled()函数中并无添加关键字virtual,这是由于虚函数是一种强继承类型的函数,只要在继承类中函数名以及参数的形式和基类的相同,那它就会被认为是一个虚函数。所以,基类中的virtual关键字是不能省的。
2 虚函数完成多态的展示,须要指针的配合。(引用也能够,这个设计到虚函数的实现,本文直说理解,暂不讨论)
3 不能将构造函数定义为虚函数。(具体查看http://blog.csdn.net/jiadebin890724/article/details/7951520)
4 虚函数必须是类的成员函数,但不能是静态成员函数。(具体讨论 http://bbs.csdn.net/topics/360075548)
暂且先这样吧!