今天,讲一讲多态:

       多态就是不同对象对同一行为会有不同的状态。(举例 : 学生和成人都去买票时,学生会打折,成人不会)

       实现多态有两个条件: 一是虚函数重写,重写就是用来设置不同状态的

                  二是对象调用虚函数时必须是指针或者引用

       ps:没有这两个条件无法构成多态,很多笔试题都会利用这个陷阱让你上当!

       实际上,代码上体现(动态)多态就是当父类指针指向子类对象,然后通过父类指针能调用子类的成员函数。

              

      什么是虚函数?什么是重写?

       虚函数是带有virtual关键字的成员函数 

       子类有个和父类完全相同(函数名,形参,返回值都相同,协变和析构函数除外)的虚函数,就称子类虚函数重写父类虚函数 

        

       多态的原理?

       多态是用虚函数表实现的。

       有虚函数的类都会生成一个虚函数表,这个表在编译时生成。

       虚函数表是一个存储虚函数地址的数组,以NULL结尾。

       如果要生成子类虚表,就要经过三个步骤:第一步,将父类虚表内容拷贝到子类虚表上;

                          第二步,将子类重写的虚函数覆盖掉表中父类的虚函数;

                          第三步,如果子类有新增加的虚函数,按声明次序加到最后

         多态如何调用?

       满足多态的函数调用,程序运行起来后,根据对象中的虚表指针来找实际应该调用的函数; 而不满足多态的函数在函数编译时就确定函数地址了。

                   

         动态绑定与静态绑定?

         静态绑定是程序编译时确定程序行为。

         动态绑定是程序运行时根据具体的对象确定程序行为。

 

        继承中的多态:

        单继承子类未重写的虚函数放在继承的父类部分的虚函数表中

        多继承子类未重写的虚函数放在第一个继承父类部分的虚函数表中,继承的虚表都会覆盖

              

       虚函数和虚表在哪里?

       虚函数和普通函数一样在代码段,vs2013测试下,虚表在只读常量区

       抽象类?

       有纯虚函数的类。

       纯虚函数就是虚函数后面再加上 = 0;

       体现了接口继承,只声明不实现 --- 比如,动物呼吸不能实现,但继承它的鱼和人都能呼吸并且呈现多态性

       final ---  让父类虚函数不能被重写  ---  体现实现继承

               

         override ---  纯虚函数 + override --- 强制重写

           

      面试题:

       1.inline函数可以是虚函数吗?

       不能,因为inline函数没有地址,无法放到虚函数表中

       2.静态成员可以是虚函数吗?

         不能, 因为静态成员函数没有this指针, 因为有this指针才能访问到虚表指针,有虚表指针才能找到虚表从而调用实际应该调用的函数。

       3.构造函数可以是虚函数吗?/虚函数指针在什么时候生成的的?

          不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的

       4.析构函数可以是虚函数吗?什么场景下析构函数是虚函数?

         可以,并且最好把基类的析构函数定义成虚函数

         当父类指针指向子类对象时,如果析构函数不是虚函数,析构就只会释放父类对象,造成内存泄漏。(因为析构重名,只能调用一个,调用默认的父类析构函数)

         定义成虚函数后,调用析构时就会取出虚表指针找到实际应该调用的函数。(指针虽然都是父类类型,但是指针内取出的虚表是不一样的,所以析构能调用子类析构)

       

       5.对象访问普通函数快还是虚函数更快?

       首先如果是普通对象,是一样快的,如果是指针对象或者是引用对象,则调用的普通函数快,因为普通对象在编译时就确定地址了,虚函数构成多态,运行时调用虚函数需要到虚函数表中去查找

      

        c++的多态性用一句话概括就是:

        在父类的函数前加上virtual关键字,在子类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数,如果对象类型是子类,就调用子类的函数,如果对象类型是父类,就调用父类的函数。

       

         

       

C++ 多态详解及常见面试题的更多相关文章

  1. TCP三次握手及四次挥手详解及常见面试题

    https://blog.csdn.net/ZWE7616175/article/details/80432486

  2. 【javascript常见面试题】常见前端面试题及答案

    转自:http://www.cnblogs.com/syfwhu/p/4434132.html 前言 本文是在GitHub上看到一个大牛总结的前端常见面试题,很多问题问的都很好,很经典.很有代表性.上 ...

  3. 夯实Java基础系列16:一文读懂Java IO流和常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  4. java常见面试题及答案 1-10(基础篇)

    java常见面试题及答案 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被 ...

  5. java常见面试题及答案

    java常见面试题及答案 来源 https://blog.csdn.net/hsk256/article/details/49052293 来源 https://blog.csdn.net/hsk25 ...

  6. python爬虫常见面试题(一)

    前言 之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆:二是给自己一个和大家交流的机会,互相学习.进步,希望不正之处大家能给予指正:三是我也是互联网寒潮下岗的那批人之一,为 ...

  7. Web开发的常见面试题HTML和HTML5等

    作为一名前端开发人员,HTML,HTML5以及网站优化都是必须掌握的技术,下面列举一下HTML, HTML5, 网站优化等常见的面试题: HTML常见面试题: 1. 什么是Semantic HTML( ...

  8. 常见面试题之ListView的复用及如何优化

    经常有人问我,作为刚毕业的要去面试,关于安卓开发的问题,技术面试官会经常问哪些问题呢?我想来想去不能一股脑的全写出来,我准备把这些问题单独拿出来写,并详细的分析一下,这样对于初学者是最有帮助的.这次的 ...

  9. iOS常见面试题汇总

    iOS常见面试题汇总 1. 什么是 ARC? (ARC 是为了解决什么问题而诞生的?) ARC 是 Automatic Reference Counting 的缩写, 即自动引用计数. 这是苹果在 i ...

随机推荐

  1. walk

    一个go做gui的包, 可以配置程序图标 编译运行需要...fest文件 rsrc

  2. 1、kafka概述

    一.关于消息队列 消息队列是一种应用间的通信方式,消息就是是指在应用之间传送的数据,它也是进程通信的一种重要的方式. 1.消息队列的基本架构 producer:消息生产者. broker:消息处理中心 ...

  3. Web前端开发(高级)下册-目录

    多媒体与绘图 多媒体音频格式视频格式 HTML5多媒体支持 <audio>和<video> htmlaudioElement和htmlVideoElement <audi ...

  4. TEX Quotes

    题目链接:https://cn.vjudge.net/problem/UVA-272 AC代码: /* */ #include <iostream> #include <stdio. ...

  5. 第09组 Beta冲刺(3/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  6. python ocr图片中汉字识别

    import os os.chdir("C:\Program Files (x86)\Tesseract-OCR") main = "Tesseract.exe d:/t ...

  7. CentOS下启动和停止Tomcat

    启动Tomcat: 进入tomcat目录/bin,然后./startup.sh 停止Tomcat: 进入tomcat目录/bin,然后./shutdown.sh

  8. 使用lombok的@Builder的注解的一个坑

    一开发说项目报错 java.lang.Long,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lan ...

  9. Java3d 案例程序

    今天偶尔翻出了很久以前写的java3d程序,很怀念曾经探索java3d解析.渲染ifc数据的日子 package com.vfsd.test0621; import java.applet.Apple ...

  10. Linux下查找命令 —— find、grep、 which、 whereis、 locate

    find命令 基本格式 find < path > < expression > < cmd > ''' path: 所要搜索的目录及其所有子目录.默认为当前目录. ...