《深入浅出MFC》中形容虚函数是执行一般化操作,一直没有领悟要点。现在的体悟是抽象,先前考虑问题都是由抽象到具象,比如下文中的示例,由上(虚基类的「怪物」)至下(派生类的三个子类「狼」「蜘蛛」「蟒蛇」)考虑。其实逆向思考一下,由具象到抽象,虚函数的作用就显而易见了,将不同的但同时也是类似的种类的行为提取成为抽象的虚基类中的虚函数,然后执行一般化操作。

c++虚函数的作用是什么?

7sDream二次元新居民/软件爱好者/零回答消灭者

可能给例子比较好理解的说~~
这样运行会输出“A”。
----------------------------------------------------------------------------------
这样会输出“B”。
--------------------------------------------------------------------------
补充:上面两个因为是图我就不改了~ @vczh 轮子哥教导我们A的析构函数也要加virtual,否则delete p的时候调的是A的析构函数可能会有问题~~
--------------------------------------------------------------------------
简单说就是
当基类指针指向一个子类对象,通过这个指针调用子类和基类同名成员函数的时候,基类声明为虚函数「子类不写也可以」就会调子类的这个函数,不声明就会调用基类的。自己体会一下0.0
--------------------------------------------------------------------------
需要用的情形的话大概是这样:
比如你有个游戏,游戏里有个虚基类叫「怪物」,有纯虚函数 「攻击」。然后派生出了三个子类「狼」「蜘蛛」「蟒蛇」,都实现了自己不同的「攻击」函数,比如狼是咬人,蜘蛛是吐丝,蟒蛇把你缠起来~~
然后出现好多怪物的时候就可以定义一个 虚基类指针数组,把各种怪物的指针给它,然后迭代循环的时候直接 monster[i]->attack() 攻击玩家就行了,大概见下图:
如果没有虚函数的话,管理一堆差不多但是类型又不一样的对象的时候就比较麻烦了。
---------------------------------------------------------------
大一水平求指导~~不知道说的对不对~~还有代码格式,变量命名神马的都求指导~0.0~ @vczh
 

其他的都挺好,除了A的析构函数不是virtual……这样你delete p是不会执行B的析构函数的
2014-05-31   

7sDream(作者) 回复 vczh
OwO,知道了~~学的时候讲到过这个问题~T^T现在又忘了………我继续学习去好了~
对了还有个问题~~今天听说MFC框架设计的不太好……那我还要不要学捏?如果不学的话要学什么来代替捏0.0~?
2014-05-31   

vczh 回复 7sDream(作者)
做GUI当然收先学C#用WPF,等你习惯了之后,以后需要用什么框架再切换不是问题。MFC太老了,新项目都不会用了。
2014-05-31   

7sDream(作者) 回复 vczh
3Q~~好嘞~~小学期自学去~一个月的没课但是又必须呆在学校的时间,应该是不会无聊了~\^0^/
2014-05-31   

基类的指针指向派生类的对象,那么通过指针只能调用基类所定义的成员函数,而如果派生类定义的是虚函数,这个指向派生类的基类指针调用的是派生类的成员函数。
2014-06-03   

就是这么个理儿!

c++虚函数的作用是什么?的更多相关文章

  1. C++之虚函数的作用和使用方法

    在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例12.1( ...

  2. C++中虚函数的作用浅析

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  3. C++中虚函数的作用是什么?它应该怎么用呢?(转)

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  4. C++中虚函数的作用

    一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始) 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Po ...

  5. [转]什么是C++虚函数、虚函数的作用和使用方法

    我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例 ...

  6. C++中虚函数的作用是什么?它应该怎么用呢?

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  7. 什么是C++虚函数、虚函数的作用和使用方法

    我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例 ...

  8. C++中虚函数的作用和虚函数的工作原理

    1 C++中虚函数的作用和多态 虚函数: 实现类的多态性 关键字:虚函数:虚函数的作用:多态性:多态公有继承:动态联编 C++中的虚函数的作用主要是实现了多态的机制.基类定义虚函数,子类可以重写该函数 ...

  9. C++中的纯虚函数和虚函数的作用

    1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...

随机推荐

  1. UIBezierPath贝塞尔弧线常用方法记

    //根据一个矩形画曲线 + (UIBezierPath *)bezierPathWithRect:(CGRect)rect //根据矩形框的内切圆画曲线 + (UIBezierPath *)bezie ...

  2. php://input,php://filter,data URI schema的那些事

    一.php://input一句话木马 在调研dedecms的历史漏洞时,发现了dedecms安装文件曾经出过被植入后门的漏洞(SSV-ID站点include目录下shopcar.class.php文件 ...

  3. UITableViewCell的选中时的颜色设置

    转自:http://hi.baidu.com/zhu410289616/item/0de0262910886011097508c2 1.系统默认的颜色设置 //无色 cell.selectionSty ...

  4. 快速掌握Flyway

    什么是Flyway? Flyway is an open-source database migration tool. It strongly favors simplicity and conve ...

  5. 欧几里得算法:从证明等式gcd(m, n) = gcd(n, m mod n)对每一对正整数m, n都成立说开去

    写诗或者写程序的时候,我们经常要跟欧几里得算法打交道.然而有没要考虑到为什么欧几里得算法是有效且高效的,一些偏激(好吧,请允许我用这个带有浓重个人情感色彩的词汇)的计算机科学家认为,除非程序的正确性在 ...

  6. C++用递归方式实现在对不更改随机数组的情况下查找最大值

    #include <iostream> #include <iomanip> #include <ctime> using namespace std; int M ...

  7. SQL2012新特性一次一个数据块----特殊的查询分页

    对于数据库人员来说,在软件项目开发的过程中,或多或少的不可避免的就是经常遇到类似“UI查询结果设计”这样的说法,当听到UI设计的时候,多数人的第一反应是“靠!关我毛事!~这是其他人的问题!”. 然而, ...

  8. (一)s3c2440 地址分配讲解 (很难很纠结)

    mini2440的地址怎么分配.mini2440处理器的地址怎么分配. S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址(也就是0x0000 0000--0x4000 00 ...

  9. css字体样式(Font Style),属性

    css字体样式(Font Style),属性   css字体样式(Font Style)是网页中不可或缺的样式属性之一,有了字体样式,我们的网页才能变得更加美观,因此字体样式属性也就成为了每一位设计者 ...

  10. sql 中实现往表中插入一条记录并返回当前记录的ID

    写一条存储过程,实现往User中插入一条记录并返回当前UserId(自增长id) --推荐写法 if(Exists(select * from sys.objects where name=N'Usp ...