深剖基类和派生类的虚函数表
1、当派生类实现基类的虚函数时,基类中虚函数表和虚函数地址和派生类中虚函数表和虚函数地址不同;
当派生类不实现基类的虚函数时,基类中虚函数表和虚函数地址和派生类中虚函数表和虚函数的地址相同。
1、派生类重新实现虚函数。查看其虚函数表和虚函数表中虚函数的地址
- #include<iostream>
- using namespace std;
- class Base{
- public:
- virtual void fun()
- {
- cout<<"This is Base Class"<<endl;
- }
- };
- class Derived:public Base{
- public:
- void fun()
- {
- cout<<"This is Derived Class"<<endl;
- }
- };
- int main()
- {
- Base B;
- Derived D;
- int **p=(int**)&B;
- cout<<"基类的虚函数表地址:"<<p[0]<<endl;
- cout<<"基类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
- p=(int**)&D;
- cout<<"派生类的虚函数表地址:"<<p[0]<<endl;
- cout<<"派生类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
- return 0;
- }
输出结果:
基类的虚函数表地址:0x445060
基类的虚函数表中虚函数的地址:0x415390
派生类的虚函数表地址:0x445070
派生类的虚函数表中虚函数的地址:0x4153dc
可以看出,基类和派生类的虚函数表不同,虚函数的地址也不同。这个结果符合预期,因为派生类中重新实现了虚函数,基类肯定
有自己的虚函数表,虚函数的地址自然是重新实现的那个。
2、派生类不重新实现虚函数。查看其虚函数表和虚函数表中虚函数的地址
- #include<iostream>
- using namespace std;
- class Base{
- public:
- virtual void fun()
- {
- cout<<"This is Base Class"<<endl;
- }
- };
- class Derived:public Base{
- };
- int main()
- {
- Base B;
- Derived D;
- int **p=(int**)&B;
- cout<<"基类的虚函数表地址:"<<p[0]<<endl;
- cout<<"基类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
- p=(int**)&D;
- cout<<"派生类的虚函数表地址:"<<p[0]<<endl;
- cout<<"派生类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
- return 0;
- }
- 输出结果:
基类的虚函数表地址:0x445050
基类的虚函数表中虚函数的地址:0x415390
派生类的虚函数表地址:0x445060
派生类的虚函数表中虚函数的地址:0x415390
派生类虽然重新实现虚函数,但是派生类有自己的虚函数表,但是虚函数表中,虚函数的地址和基类中虚函数的地址一样。
3、一个类继承多个基类时,有一张虚函数表,多个虚函数指针。
深剖基类和派生类的虚函数表相关推荐
- 807-C++多继承下,派生类对象有几张虚函数表?
C++多继承下,派生类对象有几张虚函数表? 我们看下面这个示例: #include <iostream> #include <string> #include <type ...
- 【C++】 类的内存对齐、虚函数表
本文分为以下几个部分内容: 什么是内存对齐,为什么要内存对齐 C++的空类,以及没有虚函数和非静态变量的类 C++类的内存分布(成员变量) C++类的内存分布(虚函数) 一个类的情况 继承关系中的 ...
- C++单个类的所有对象是否共享虚函数表的验证
今天偶然看到这个面试题,第一感觉是既然所有对象共享虚函数代码,那么虚函数指针对所有对象就是一样的,因此虚函数表也就是一样的,没有必要为每个对象复制一份一模一样的虚函数表.所以做个验证,在这儿记录一下. ...
- C++中基类与派生类的构造函数和析构函数
1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...
- C++ 虚函数在基类与派生类对象间的表现及其分析
近来看了侯捷的<深入浅出MFC>,读到C++重要性质中的虚函数与多态那部分内容时,顿时有了疑惑.因为书中说了这么一句:使用"基类之指针"指向"派生类之对象&q ...
- 派生类到基类的转换 和基类到派生类的转换
一. 基类与派生类的转换 3种继承方式(公用.保护.私有继承)中,公用派生类才是基类真正的子类型,它完整地继承了基类的功能. 不同类型数据之间在一定条件下可以进行类型的转换.基类与派生 ...
- C++:基类和派生类
4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public:void print(){cout<<"name:"<& ...
- 基类与派生类之间的转换关系
一. 派生类到基类的转换: 1.可以使用派生类指针初始化基类指针,同样也可以使用派生类的引用或对象初始化基类的引用,注意这里提到的是对象的指针和引用而不是对象本身: (但是,在使用基类指针(或引用)指 ...
- 构造函数怎么在主函数调用_C++ 虚基类及其派生类构造函数(学习笔记:第7章 12)...
虚基类及其派生类构造函数[1] 建立对象时所指定的类称为最远派生类. 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的. 在整个继承结构中,直接或间接继承虚基类的所有派生类,都 ...
最新文章
- Ext-第一课基本配置
- ×××技术在ATM机无线组网中的应用
- 简单计算机面试题库及答案_460道Java后端面试高频题答案版【模块六:计算机操作系统】...
- 几种HtmlEncode的区别(转)
- [蓝桥杯2016决赛]七星填数-next_permutation枚举
- python函数作用域与闭包_python基础-08-内置函数、作用域、闭包、递归
- Laravel关联模型中过滤结果为空的结果集(has和with区别)
- oracle中外键的使用方法,Oracle数据库中外键的相关操作整理
- 基于python的贪吃蛇游戏设计论文_《贪吃蛇游戏课程设计》报告毕业设计(论文)...
- 使用计算机打印资料时需要安装打印机驱动,打印机驱动安装步骤详解(一)_电脑基础知识_IT计算机_专业资料...
- 数据库实验——T-SQL编程
- 现代数字信号处理总结 下
- 两台电脑之间实现串口通信
- 用proteus来看二极管的单向导电性
- Android开发-蓝牙遥控器(字符串形式发送)-应用例程
- 商城后台学习/笔记/思考
- ASP.NET Core WebApi构建API接口服务实战演练
- Apollo搭建使用
- 快速搭建springboot+mybatis-plus代码自动生成器的后端框架
- Kubernetes弃用Docker?关于Kubernetes、Docker和containerd的那些事
热门文章
- 音标课件软件测试,宝宝益智英语字母音标(测试版)
- linux ext4 img解包打包教程,安卓解包、修改、打包system.img/system.img.ext4教程
- 网易(weather)天气预报接口
- 嵌入式硬件Linux,嵌入式linux硬件什么要求
- python代码如何加密
- ASO | APP推广之ASO优化中的九大奥义。
- QQ空间迁移_【SRX550_HA_以及端口绑定高可靠性尝试】
- 背景图片的精灵图的使用
- 判断链表是否为【回文结构】
- hp打印机计算机无法与设备建立,hp 程序无法安装解决方法,hp打印机安装教程 电脑维修技术网...