【C++基础】 各种“虚”总结(ing...)
虚基类,虚函数,虚析构函数,纯虚函数,虚函数表(待补充)
一.虚基类——在继承方式(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 纯虚函数】相同:都能派生新的类,实现动态绑定
不同:
| 函数体为空的虚函数 | 纯虚函数 | |
| 函数体 | 有,只是为空 | 根本没有函数体 |
| 所在类 | 普通基类 | 抽象类 |
| 实例化 | 可以 | 不能直接实例化 |
*********笔面试题目**********************************************
【C++基础】 各种“虚”总结(ing...)的更多相关文章
- C++语言基础(12)-虚函数
一.虚函数使用的注意事项 1.只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加. 2.为了方便,你可以只将基类中的函数声明为虚函数,这样所有子类中具有遮蔽(覆盖)关系的同 ...
- C++语言基础(10)-虚继承
一.产生背景 先看下列一份代码: //间接基类A class A{ protected: int m_a; }; //直接基类B class B: public A{ protected: int m ...
- C++基础:虚函数、重载、覆盖、隐藏<转>
转自:http://www.2cto.com/kf/201404/291772.html 虚函数总是跟多态联系在一起,引入虚函数可以使用基类指针对继承类对象进行操作! 虚函数:继承接口(函数名,参数, ...
- [C++基础] 纯虚函数
整理摘自https://blog.csdn.net/ithomer/article/details/6031329 1. 申明格式 class CShape { public: ; }; 在普通的虚函 ...
- c++基础之虚函数表指针和虚函数表创建时机
虚函数表指针 虚函数表指针随对象走,它发生在对象运行期,当对象创建的时候,虚函数表表指针位于该对象所在内存的最前面. 使用虚函数时,虚函数表指针指向虚函数表中的函数地址即可实现多态. 虚函数表 虚函数 ...
- C++基础之虚析构函数原理
结论 虚函数表指针 + 虚函数表 共同实现 演示 VS2017(32位) 基类有析虚构函数 一段代码演示 #include <iostream> #include <memory&g ...
- 【板子】数论基础(持续更新ing...)
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...
- C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)
多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...
- C/C++基础知识总结——多态性
1. 多态性的概述 1.1 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对垒的成员函数的调用,不同行为是指不同的实现. 1.2 多态的实现 (1) 实现角度讲多态可分为两类:编 ...
随机推荐
- 如何同时启动多个Tomcat服务器
1.使用压缩版的tomcat不能使用安装版的. 2.第一个tomcat的配置不变. 3.增加环境变量CATALINA_HOME2,值为新的tomcat的地址:增加环境变量CATALINA_BASE2, ...
- Convert Windows 32bit dirver to Windows 64bit
Pre-condition: 1.source code(vc6.0+WDK based) Development environment: 2.VS2013 3.WDK 8/8.1 Steps: 1 ...
- 【转】Linux杀死fork产生的子进程的僵尸进程defunct
僵尸进程 就是 已经结束,但是还没有清理出去的.用kill -9 $PID 也无法杀死. 所以程序中应该避免出现僵尸进程. 用fork之后,父进程如果没有wait /waitpid 等待子进程的话,子 ...
- spring读取prperties配置文件(1)
博客地址http://www.cnblogs.com/shizhongtao/p/3438431.html 属性文件命名是*.properties,在java中,用类java.util.Propert ...
- opencv java api提取图片sift特征
opencv在2.4.4版本以后添加了对java的最新支持,可以利用java api了.下面就是我利用opencv的java api 提取图片的sift特征. import org.opencv.co ...
- Linux 内核 链表 的简单模拟(2)
接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...
- 什么是MBR?(含图解)
Mbr位于磁盘的0柱面,0磁头,1扇区. MBR 有三部分构成,主引导程序,硬盘分区表DPT和,硬盘的有效标志55AA.在512个字节的主引导扇区里. 主引导程序占446个字节,dpt占6 ...
- jLink(v8)GDB 命令总结
/** ****************************************************************************** * @author Maox ...
- IE6下window.location.href不跳转到相应url
前天一同事遇到个看似很诡异的问题,就是<a href="javascript:void(0);" onclick="window.location.href=url ...
- php调试利器 -- xdebug
之前整理在印象笔记中,现在搬出来.分本地调试和远程调试.本文亲测通过并截图,有问题欢迎留言探讨. (参考网上多位前辈的博客,整理在笔记里忘记保存原文链接,这里无法贴出链接,望见谅) # 痛处 一般 ...