虚基类,虚函数,虚析构函数,纯虚函数,虚函数表(待补充)

一.虚基类——在继承方式(public / private)之前加 virtual

class B1: virtual public B0{};

作用:防止多重继承中二义性,保证成员唯一标识是核心。

【比较】 作用域分辨符::  vs  虚基类

相同:都是为了保证 唯一标识成员

不同:①“::” 在派生类中,同名成员有多个拷贝,通过积累名来唯一标识。可以容纳更多数据  D1 d1;      d1.B1 :: nV = 2;

②虚基类,只维护一份成员拷贝。更节省内存

二.虚函数——函数声明前加 virtual

virtual void Display( ){}

虚函数是动态绑定的基础。 一般将基类中的同名函数声明为 virtual。

用基类类型指针指向派生类对象,则通过基类指针可以使属于不同派生类的不同对象产生不同的行为,从而实现动态绑定。

动态绑定三个条件(官方版):①类之间满足类型兼容规则

②(一般基类中)声明虚函数

③由成员函数来调用 或者通过指针、引用来访问虚函数

【注意】构造函数不能为虚

“虚函数的意思就是开启动态绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时候,这个对象的动态类型还不完整,没有办法确定它到底是什么类型,故构造函数不能动态绑定。(动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?)”

“虚函数采用一种须调用的方法。虚调用是一种可以在只有部分信息情况下工作的机制,特别是允许调用一个只知道接口而不知道其准确对象类型的函数。

但是要创造一个对象(构造函数),必须要知道对象的准确类型。”(程序员面试宝典4版P118)

三.虚析构函数

virtual ~类名();

其他同 一般的虚函数,示例代码传送门:【虚】示例代码

四.纯虚函数—— 普通虚函数后加“ =0 ”

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

用处:对基类中不实现的函数,则在基类中只声明原型来规定整个类族的同一接口,而在派生类中给出具体的实现,避免代码冗余(别的作用??)

【注意】①在基类同时也是抽象类中声明(因为带有纯虚函数的类就是抽象类);  ②只有声明没有实现部分,即没有函数体

【函数体为空的虚函数 vs 纯虚函数】相同:都能派生新的类,实现动态绑定

不同:

  函数体为空的虚函数 纯虚函数
函数体 有,只是为空 根本没有函数体
所在类 普通基类 抽象类
实例化 可以 不能直接实例化

*********笔面试题目**********************************************

参考:剑指XX游戏(四) - 轻松搞定面试中的“虚”

【C++基础】 各种“虚”总结(ing...)的更多相关文章

  1. C++语言基础(12)-虚函数

    一.虚函数使用的注意事项 1.只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加. 2.为了方便,你可以只将基类中的函数声明为虚函数,这样所有子类中具有遮蔽(覆盖)关系的同 ...

  2. C++语言基础(10)-虚继承

    一.产生背景 先看下列一份代码: //间接基类A class A{ protected: int m_a; }; //直接基类B class B: public A{ protected: int m ...

  3. C++基础:虚函数、重载、覆盖、隐藏<转>

    转自:http://www.2cto.com/kf/201404/291772.html 虚函数总是跟多态联系在一起,引入虚函数可以使用基类指针对继承类对象进行操作! 虚函数:继承接口(函数名,参数, ...

  4. [C++基础] 纯虚函数

    整理摘自https://blog.csdn.net/ithomer/article/details/6031329 1. 申明格式 class CShape { public: ; }; 在普通的虚函 ...

  5. c++基础之虚函数表指针和虚函数表创建时机

    虚函数表指针 虚函数表指针随对象走,它发生在对象运行期,当对象创建的时候,虚函数表表指针位于该对象所在内存的最前面. 使用虚函数时,虚函数表指针指向虚函数表中的函数地址即可实现多态. 虚函数表 虚函数 ...

  6. C++基础之虚析构函数原理

    结论 虚函数表指针 + 虚函数表 共同实现 演示 VS2017(32位) 基类有析虚构函数 一段代码演示 #include <iostream> #include <memory&g ...

  7. 【板子】数论基础(持续更新ing...)

    #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...

  8. C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)

    多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...

  9. C/C++基础知识总结——多态性

    1. 多态性的概述 1.1 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对垒的成员函数的调用,不同行为是指不同的实现. 1.2 多态的实现 (1) 实现角度讲多态可分为两类:编 ...

随机推荐

  1. Struts升级到2.3.15.1抵抗漏洞

    后知后觉,今天才开始修复Struts2的漏洞 详细情形可以参考: http://struts.apache.org/release/2.3.x/docs/security-bulletins.html ...

  2. 通过Curator操作Zookeeper的简单例子代码

    Curator主要解决了三类问题: 一个是ZooKeeper client与ZooKeeper server之间的连接处理; 一个是提供了一套Fluent风格的操作API; 一个是ZooKeeper各 ...

  3. Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记

    睡眠机制 我们活着的时候,大脑会产生脑电波.脑电图仪器通过贴在人头上的一些电极读出脑电波的活动,然后把活动用图表显示出来. 睡眠过程可以分为5个过程,划分依据与大脑发出的脑电波类型. 当人清醒时,大脑 ...

  4. 个人站长如何使用svn发布到服务器不遗漏文件

    作为个人站长,最最头疼的一件事情就是在本地开发好代码之后,上传的时候要去服务器上一个一个文件进行覆盖,添加操作:是人难免出错,避免这种情况的方法: 开发者最好是在本地有一个代码库,创建好代码库之后,至 ...

  5. 浅谈Javascript闭包

    垃圾回收器 我个人把闭包抽象的称之为”阻止垃圾回收器的函数”或者”有权访问另一个函数内部变量的函数"(当然这个是我个人的理解方式,每个人可能会有不同的理解方式),为什么这样说?这样说还得说说 ...

  6. 弹性布局学习-详解align-content(六)

    弹性布局学习-详解align-content(六)

  7. Android:ListView之ViewHolder

    前言 在开发Android应用过程中经常要与列表展示打交道,比如Listview.在使用过程中如果不能正确的进行细节处理那么对性能还是有很大的损耗的. Listview展示内容是通过一个Adapter ...

  8. 禁止指定目录执行php文件

    我们设置网站权限的时候,有些目录不得不设置让http服务器有写入权限,这样安全隐患就来了.比如discuz x2的 data目录,这个必须要有写入限,论坛才能正常运行,但有的黑客可能就会利用这个目录上 ...

  9. java环境搭建的问题

    本人用eclipse开发,首先在java官网中下载最新版本的jdk,jdk的版本一定要与eclipse版本位数相同,否则会提示错误“Java was started but returned exit ...

  10. clients(PV操作共享内核内存进行输入输出分屏) - server(进程间通信)模型实现

    1.拓扑结构 2.PV操作共享内核内存进行输入输出分屏 (1) int semop(int semid,struct sembuf *sops,size_t nsops): 功能描述 操作一个或一组信 ...