您的位置:首页 > 编程语言 > C语言/C++

浅谈c++的精髓之继承和多态

2016-09-10 15:00 309 查看
1.为什么要用面向对象的思想去编程?
        c语言是从人的正常处理一个事情的常规逻辑出发的,面向单个个体的处理流程的模式,属于面向过程的编程思想,这种方式的好处就是直观易懂,符合人处理事情的常规逻辑,那么,为什么要从面向过程的编程思想过渡到面向对象的编程思想呢?这是因为人们发现在处理非常相似或具有某些抽象的共性的问题时往往不能直接移植过来,而是需要进行大量的细节修改,导致代码的复用性非常低,从而导致编程工作量增大,编程效率低下。这也严重制约了快速开发的发展需求;
      那么,人们在想,我该怎样提高代码的复用性呢?首相想到的就是在处理相似类型的问题时我可以公用大量相同的代码,那么,首先我要对个体进行归类然后抽象出他们的共性,针对这些共性制定统一的处理模块统一处理这些共性问题,这将大大的提高了代码的复用性,那么,就要对个体进行对象类型的划分,这就是面对对象编程思想雏形的产生。
      【总结】面对对象编程的产生就是为了提高代码的复用性,满足快速开发的需求。
2.为什么继承和多态是面向对象编程的精髓呢?
 
    为什么说继承和多态是面对对象编程的精髓呢?首先,我们的出发点还是提高代码的复用性,那么,继承就是一种最为直观的复用,这样对一种类型的所有对象对他们共有的某种共性只定义一次,便可以通过继承的方式无需做任何修改的进行复用(当然这是最为简单理想的 一种情况),比如说我们定义了动物这个大类,我们知道动物有这样的共性,即多以有机物为食料,有神经,有感觉,能运动,假如现在我们要对所有的动物定义一个标明生理特征的方法显示自己的一些特征标签供参观者查看,我们可以在每一类动物类中放置这样一个输出特征标签的函数来表明生理特征,即输出“有神经,有感觉,能运动”,但如果真的为每一种动物去写这样一个表明特征的输出函数,会造成大量没必要的重复,导致效率极低,我们的出发点四提高代码的复用性,那么,我们现在完全可以把这样一个函数放在“动物”这个基类中,通过继承让所有种类的动物都拥有这样具有输出功能的函数,且不做任何修改的继承。这就是继承这种一劳永逸的思想带给我们极大的好处,当我们实现了上述这种非常便捷的继承思想处理问题时,我们在想,我们能不能把所有的问题都归纳成上述这种方式去一劳永逸的便捷的去处理呢?最好是只在基类中写相应的方法,通过继承让其他类直接复用,答案是"NO",正如世界上没有相同的两片叶子,不管多么类似的对象,它们都有各自的差异性,那么,我们怎么解决既想通过继承来提高代码的复用性,又不得不去考虑各自的差异性,这就引进了覆盖(override),或者称为重写这种机制,当我们尽可能的顾全大局的在基类中放置一些非常通用的函数以供派生类继承使用,从而提高代码的复用性,但是肯定会有个别的有差异的对象不能完全使用继承过来的这个函数,那么,他就会自己定义一个功能非常相似又略有差异的同名函数(同名函数的作用很大意义上是一类相同或者相似操作的标识,这样可以避免在使用接口的时候出现各种功能相同或相似的操作但函数名称却千差万别的情况,给使用者带来困惑,),把基类继承过来的函数屏蔽掉(注意和函数重载的区别),从而很好的解决了个体的细小差异性,而使大部分都可以复用,这就是重写基类。再说说继承这种机制另一个非常好的作用,即代码的可扩展性,不管是基类重写还是派生定义自己的成员,都可以看做是派生类的扩展性。正是这种可扩展性才最大可能的促进了代码的复用性。
      那么,为什么要引进虚函数这种机制呢?我们发现,当我们需要在派生类中将继承过来的基类的某些方法进行修改以适应派生类的处理要求后(通常采用同名函数的隐藏基类的方法),也就是基类的重写,但当我们用基类指针指向派生类调用函数时,并不会调用派生类重定义的函数(这是因为基类不能调用派生类成员),这个显然不是我们想要的,这时我们就要把基类指针显式的强制转化成相应的派生类指针,然后才会调用派生类的重定义函数,这样会非常繁琐,那么,我们可不可以有这么一种机制,当基类指针指向他的派生类对象调用某一特定的函数时,会优先自动调用该派生类的这个函数,如若该派生类没有这个函数,他会自动沿着继承链向上爬,找到这个同名函数停止,这个方法正是虚函数给我们解决的。
      (这里需要强调的一点是:上述这种情况中,本来派生类对象或者指针自己调用自己的成员函数时就不会出现上述的问题,那么,我们为什么非要用基类指针去指向派生类,然后调用派生类的成员呢,这个优势不言而喻,比如上述提到的动物类,动物都会繁殖,所以我把繁殖方式这种方法写在基类中供派生类继承,但是不同的动物又有不同繁殖方式,所以在我要在派生类中进行重定义,当我把动物类所有的派生对象用一个统一的类型即动物指针类型存储在数组里后,非常有利于对整个类的整体操作减少代码的重复性,但这时我要输出每个动物派生类对象的繁殖方式时,我就得把这个数组里的指针取出来,然后判断到底是哪个派生类型的,在调用他的繁殖方式的函数,这又与前面“操作减少代码的重复性”矛盾,所以我们引进虚函数让他自己判断该调用哪个函数,这正是多态性的体现,同时大大减少的开发量http://zhidao.baidu.com/link?url=Akves6QvMWOW3RACTOH2cvLXGy_NTJON8cbKaNl53zktSw1nh8W-ssG0T2IoB0K566eXUph-kJ2E2rQGmdCtbJ-Cvc1d0kIZaGTOfDg96KW

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息