记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下。

装逼一刻:

最近,本人思想发生了巨大的转变,在大学的时候由于读书少,经常写一些玩具程序而沾沾自喜,总之一句话,那时写程序纯粹是为了写程序而写程序。然而,作为大部分的学习者来说,往往忽略了学习开发语言的本质。即C++语言的设计思想也是以服务生产生活为主的,总结成一句话就是C++是实用的。我们在学习这门语言的一些特性的时候,上来就开始直接去记忆或者揣摩这些特性的本身往往不是一个很好的学习方法。

当你弄明白了这个特性是为了解决什么问题而设计的时候,在现实中有那些应用的时候,再去结合理解这些特性就会很容易理解的更深刻,更难忘。

同时,写程序也一样,作为一个以前上来就开始写程序的人深深觉得以前的自己很愚蠢。哪怕你去写一个很简单的接口函数,都要去尽量的想,这个程序的参数可能是有那些人通过那些操作来传递的,他们可能出现的误操作是那些?如果出现了误操作该怎么去处理?当想清楚了这一切再去写函数。(想的多的人,往往比上来蛮干的人,要牛x的多。)

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

so,既然装了那么多逼,那么为什么要设计虚函数这个概念呢!

谈到这里,不得不谈下多态,有人经常会问什么是多态?其实,多态简单的说就是不同的对象受到相同的刺激而产生的不同反应。最直接明了的例子就是在windows平台下,你双击不同类型的文件,会调用不同的关联软件去打开一样。比如,点击word类型文件,系统会调用word来打开,点击一个.mp4文件,快播就默默的蹦出来了。所以,这就是多态,一个相同的动作,遇到不同的对象产生不同的反应,就是这么一致和高效。

可能有人会说了我擦,这特么不太正常了吗!点击不同的文件,出现不同的反应在人类来看这也许就是天经地义的事情,并没有什么呀!可是作为一门语言想要达到这样的效果,还是需要一番深思熟虑的考虑以及巧妙的设计,当然这些人都是顶级的计算机专家了。他们为了解决这些我们人类逻辑看来天经地义的事情而设计了虚函数。

从某种程度上来讲,虚函数是为实现多态而存在的。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

show code:

接下来就到了我们最喜欢的show code环节:为了方便理解,仍然举双击文件的例子。

我们假设这里有三个类,分别是 基类 - CFile    派生类 - CMovie  派生类 - CMusic  。三个派生类分别代表,电影文件 音乐文件 。

假如这些文件都有一个接受双击后的函数反应,定义为Clicked。

因此有了下面简单的代码:

 /**********************************************************************
programe: butter know virtual function
auther: heat nan
data: 2015.8.19
mail: 964465194@qq.com
************************************************************************/ #include<iostream>
using namespace std;
class CFile
{
public:
CFile()
{
}
virtual void Clicked()
{
cout<<"I am doing nothing!"<<endl;
}
};
class CMovie:public CFile
{
public:
CMovie()
{
cout<<"My name is wujiandao!"<<endl;
}
void Clicked()
{
cout<<"Video type,KuaiBo will running!"<<endl;
}
};
class CMusic:public CFile
{
public:
CMusic()
{
cout<<"My name is the fox!"<<endl;
}
void Clicked()
{
cout<<"Music type,Kugou will running!"<<endl;
}
};
int main()
{
CFile A;
CMovie W;
CMusic F; CFile *ptr=&A; ptr=&W;
ptr->Clicked(); ptr=&F;
ptr->Clicked();
return ;
}

有了上面,如此简单粗暴的例子,以及一个很直观的多态例子,相信对为什么要虚函数,以及引入虚函数做什么就很清楚了。

其实上面这个简单的例子我觉得就可以这样理解,ptr这个指针呢,就可以理解为双击操作,当然实时情况并不是这样,这里只是简化理解,当这个指针操作不同类型的文件时产生不同的反应。那么,不用Clicked函数不声明为虚函数可以吗?答案是否定的。不信可以试试。

一定要明白一件事情:虚函数不是为什么有这样的功能,而是人们为了实现某种特定的功能而去设计的虚函数的一些特性和功能。

————————————————————————————————————————————————————————————————————————————

PS:虚函数的一些细节问题:

1 注意到继承类中的Clicled()函数中并没有添加关键字virtual,这是因为虚函数是一种强继承类型的函数,只要在继承类中函数名以及参数的形式和基类的相同,那它就会被认为是一个虚函数。因此,基类中的virtual关键字是不能省的。

2 虚函数完成多态的展现,需要指针的配合。(引用也可以,这个设计到虚函数的实现,本文直说理解,暂不讨论)

3 不能将构造函数定义为虚函数。(具体查看http://blog.csdn.net/jiadebin890724/article/details/7951520

4 虚函数必须是类的成员函数,但不能是静态成员函数。(具体讨论 http://bbs.csdn.net/topics/360075548

暂且先这样吧!

从实用主义深入理解c++虚函数的更多相关文章

  1. 深入浅出理解c++虚函数

    深入浅出理解c++虚函数   记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下. 装逼一刻: 最近,本人思想发 ...

  2. MFC 虚函数与消息映射区别

    初学MFC添加函数时,总是纠结于是 Add  windows message handler or Add virtual function 说到底不理解MFC中虚函数与消息处理函数的设计区别 本人理 ...

  3. 【转】深入理解C++的动态绑定和静态绑定 & 不要重定义虚函数中的默认参数

    为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误.需要理解四个名词:1.对象的静态类型:对象在声明时采用的类型.是在编译期确定的.2 ...

  4. 《c++编程思想》关于虚函数在构造函数行为的理解,理解有误,望告知!

    <c++编程思想>书上有一段话:在任何构造函数中,可能只是部分形成对象——我们只能知道基类已被初始化,但并不知道哪个类是从这个基类继承来的.然而,虚函数在继承层次上是“向前”和“向外”进行 ...

  5. 对C++虚函数的理解

    关于类不断被继承的过程,从整体上看,是一个从抽象到逐渐具体化的过程,基类可以是非常非常抽象的东西,而最终实例化的派生类就非常具体了. 虚函数的意义,就在于定义了一个从最早的基类到最终的派生类都可能会用 ...

  6. 对C++虚函数、虚函数表的简单理解

    一.虚函数的作用 以一个通用的图形类来了解虚函数的定义,代码如下: #include "stdafx.h" #include <iostream> using name ...

  7. 关于C#虚函数和构造函数的一点理解

    虚函数感觉总是很神秘,在本质的原理上一直也没有弄得很透彻,今天又有一点的新的感悟,纪录下来,有时间的话可以去研究一下C++对象模型 using System; using System.Collect ...

  8. 看懂下面C++代码才说你理解了C++多态虚函数!

    #include <iostream> using namespace std ; class Father { private :  virtual void Say()  //只有添加 ...

  9. C++:抽象基类和纯虚函数的理解

    转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ...

随机推荐

  1. cxf开发Restful Web Services

    一.restful web services rest全称是Representation State Transfer(表述性状态转移).它是一种软件架构风格,只是提供了一组设计原则和约束条件.在re ...

  2. PL/SQL之--流程控制语句

    一.简介 像编程语言一样,oracle PL/SQL也有自己的流程控制语句.通过流程控制语句,我们可以在PL/SQL中实现一下比较复杂的业务逻辑操作.而无需到程序中去控制,在一定程度上提高了效率,这也 ...

  3. mysql插入数据与删除重复记录的几个例子(收藏)

    mysql插入数据与删除重复记录的几个例子 12-26shell脚本实现mysql数据的批量插入 12-26mysql循环语句插入数据的例子 12-26mysql批量插入数据(insert into ...

  4. Spring4定时器 cronTrigger和simpleTrigger实现方法

    spring4定时器 cronTrigger和simpleTrigger实现方法 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz 允许 ...

  5. 20150912华为机考1之"输入一个字符串,将其中出现次数最多的字符输出"

    不吐槽华为的服务器了,直接上正文 输入:字符串(英文字母),长度不超过128 输出:出现频率最高的字母 思路写在注释文档 /* Input a string * Output the most fre ...

  6. Excel中利用IF和TIME函数计算出上下班状态!

    大家都知道现在上下班实行打卡制,制作考勤的人员需要对你上下班的时间,计算出上下班的状态,比如:迟到.早退.加班.正常等.下面为您介绍一个“帮手”.     1.打开Excel文档.如下图       ...

  7. SQL SERVER 2012 使用订阅发布同步数据库

    软件做大了,客户就多了,一个数据库服务器是远远不够的,当有一台数据服务器卦掉,那整个系统就会崩溃,所以必须考虑到数据库的自动同步与备份,当一台数据库服务 器宕机,自然就有用一台数据服务器启动起来保证整 ...

  8. Linux下安装使用NMON监控、分析系统性能

    背景:今天在LoadRunner11.0中使用rstat监控linux过程中,始终提示如下错: Monitor name :UNIX Resources. Cannot initialize the ...

  9. C# 读取Excel

    直接添代码: public void connExcel(string strPath) { //string strConn = @"Provider=Microsoft.Jet.OLED ...

  10. 使用List的addAll()方法请判空指针

    在写代码的时候经常会用到List,Set的addAll()方法,但是要注意addAll()方法不能传入空指针. package link.mengya.utils; import link.mengy ...