面向对象编程与虚函数的介绍

一、面向对象编程

OO基础:抽象、封装、继承、多态

OO原则:封装变化、多用组合,少用继承、针对接口编程,不针对实现编程

OO模式:策略模式:定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

OO特性:可复用、可扩充、可维护

     这些概念的出现,完全就不是为了编程的功能实现,而是编程的易用和扩展,准确的来说是方便再次开发而提出的一种标准而已。如果仅仅只要写个自己用的功能性的程序,那的确可以用不到上面这些麻烦的东西。

     在面向对象设计的过程中,类是从抽象逐渐具体起来的,父类可以是非常非常抽象的东西,而最终实例化的子类就非常具体了。在这个继承的过程中,不断的对父类进行填充丰富,最终得到的子类就是有血有肉的

二、虚函数

     虚函数的意义,就在于定义了一个从最早的父类,到最后的子类,都必须具备的一个功能(函数),只是在不断的进化(继承)中,这个功能会略微发生改变。通过虚函数,我们在调用不同的衍生类的时候,可以拥有不同的功能。

通过如下例程可以了解其内部操作:

 Animal *a = new Dog()
 a->bark()

编译器在静态联编时做了以下转换
a->bark ---> Animal::bark(a)
当bark函数被设置为虚函数时,就不会进行那个转换了,而是转化为
a->bark ----》 (a->vtpl[1])(a)

先通过a指针找到对象,再找到对象中的虚表,再在虚表里面找到该调用的那个函数的函数指针。

因为必须要在a指向的对象里面找,所以必须等到a被创建出来,所以必须是运行时才能知道使用哪个对象的函数。
所以这就是动态联编,运行时决定调用哪个函数。

三、纯虚函数

定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。      

在基类中实现纯虚函数的方法是在函数原型后加“=0”,如: virtual void funtion1()=0

引入原因:
  1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
  2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
   为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
        声明了纯虚函数的类是一个抽象类。所以,用户不能创建类的实例,只能创建它的派生类的实例。
      纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。
       定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。
       纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的缺省实现。所以类纯虚函数的声明就是在告诉子类的设计者,“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它”。


本文部分内容引自知乎问题 《c++虚函数的作用是什么?》


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值