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

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

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   
技术分享
就是这么个理儿!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。