• 第十二章 多态性与抽象类


    第十二章 多态与虚函数

    一、多态的概念

    向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为

    具有不同功能的函数名可以用同一个函数名,以实现用一个函数名调用不同内容的函数

    *静态多态和动态多态(编译时的多态性和运行时的多态性)

    静态多态的特点:调用速率快、效率高,但缺少灵活性,在程序运行前就已经决定了执行的函数和方法

    动态多态的特点:不在编译时确定调用的是哪个函数,只有在程序运行时才动态确定操作所针对的对象。动态多态是通过虚函数实现的。

    二、利用虚函数实现动态多态性

      *虚函数的作用

    函数重载处理的是同一层次上的同名函数问题,而虚函数处理的是不同派生层次的同名函数问题,前者是横向重载,后者可以理解成是纵向重载。(不同点:同一类族虚函数首部是相同的,而函数重载时的函数是不同的(这里指函数参数个数或类型不同))

     

    *静态关联与动态关联(早期关联与滞后关联)

     

    *虚函数声明

    1.只能用virtual声明类的成员函数,把它作为虚函数

    2.一个成员函数配声明为虚函数后,在同一类族就不能再定义一个非virtual 且函数首部相同的函数

    3.考虑事项:

    (1)如果成员函数在类的继承后出现功能的更改一般声明为虚函数

    (2)如果通过基类指针或者引用去访问,则应当声明为虚函数

    (3)有时会定义空函数体的虚函数,留给派生类添加

     

    *虚析构函数

    当基类有非虚析构函数时,只执行基类的析构函数,不执行派生类的析构函数。如果希望能执行派生类的析构函数,可以讲基类的析构函数声明为虚构函数,此时,该基类所有的派生类的析构函数都自动成为虚函数,即使派生类与基类的析构函数名不同。

    注:构造函数不能声明为虚函数

     

    三、纯虚函数与抽象类

    1.纯虚函数概念

    对于基类的虚函数不作任何处理的情况的一种简化形式

    virtual 函数类型 函数名(参数表)= 0

    注意:纯虚函数没有函数体;最后的=0不表示函数返回值为0,只起形式作用;

    2.抽象类

    含有纯虚函数的类就是抽象类

    只用来派生,不用来生成定义对象

    四、结论

    1.某基类包含一个或多个纯虚函数,就是抽象类

    2.抽象类一般不是现实存在的对象的抽象

    3.在类的层次结构中,顶层或最上面几层都可以是抽象类

    4.抽象基类是本类族的共用接口,或者说是从同一基类派生出的多个类有同一接口,因此,能响应同一形式的消息。

    5.如果基类声明了虚函数,则在派生类中出现首部相同的函数均为虚函数(默认)

    6.使用虚函数提高了程序的可扩展性。

     

    个人笔记,仅供参考,欢迎指教!

    未经允许,请勿转载!

    个人分享,欢迎指导,未经允许,请勿转载。谢谢!
  • 相关阅读:
    html图片预览
    网易DBA私享会分享会笔记2
    网易DBA私享会分享会笔记1
    centos6.5适用的国内yum源:网易、搜狐
    如何去除 ckeditor 上传图片后在原码中留下的 style="width: 100%;height:100px"之类的代码呢?
    关于json.ajax ,php的那点事
    去掉所有的html标签
    about JNI
    some knowledge of maven {maven实战}
    What is Proguard?
  • 原文地址:https://www.cnblogs.com/hello-OK/p/7002551.html
Copyright © 2020-2023  润新知