1. 基类指针指向派生类对象

#include "stdafx.h"
#include <iostream>
using namespace std;class A
{
public:A():a(10){}
private:int a;
};class B : public A
{
public:virtual void print(){cout<<"it is B print"<<endl;}
};void main()
{B b;A *pa = &b;int *pa1 = (int*)&b;cout<<"b的首地址是:"<<&b<<endl;cout<<"pa指向的地址是:"<<pa<<endl;cout<<"pa1指向的地址是:"<<pa1<<endl;
}

问题:
这里的三个地址一样吗?为什么。

运行结果:

解释:
1)&b和pa1的地址相同没问题,因为类型一个是B* ,一个是int*,指针类型影响的只是指向内存的大小和其中内容的解释方式。比如: int* 代表的含义就是:从变量首地址开始,共取sizeof(int)=4个地址,将地址中的值组成一个int值。

2)为什么&b和pa的地址不相同?
答:首先我们要了解哪些东西是放到类变量中的:
(1)非静态成员变量
(2)虚函数指针(4byte)
所以,class A定义的对象中只会包含a变量。class B是继承于class A,所以他包含a变量,除此之外还有一个虚函数指针(暂且命名:vptr1),因为它的里面有虚函数。那a变量和vptr1在b对象中存放的顺序是怎么样的呢?
(1)vptr1
(2)a
注:vs2010顺序是这样,其他编译器可能不同。

所以当A* pa = &b的时候,编译器是知道这是不同类型且class A是 class B的父类,所以会将b对象中的class A部分对应地址赋值给pa。所以这里正好偏移了4byte(从输出结果可见)。

虚函数指针(vptr)与虚函数表(vptb)相关推荐

  1. C++中虚继承产生的虚基类指针和虚基类表,虚函数产生的虚函数指针和虚函数表

    本博客主要通过查看类的内容的变化,深入探讨有关虚指针和虚表的问题. 一.虚继承产生的虚基类表指针和虚基类表 如下代码:写一个棱形继承,父类Base,子类Son1和Son2虚继承Base,又来一个类Gr ...

  2. 【C++】虚函数指针和虚函数列表

    本篇文章主要来讲述,C++多态的实现原理,也就是虚函数和虚函数列表是怎么回事?它们是如何实现多态的? 虚函数概述: 首先,C++多态的实现是通过关键字virtual,有了这个关键字之后,通过继承的关系 ...

  3. 猿创征文|深入剖析多态的实现原理与虚函数指针

    学习导航 一.多态实现原理 二.不同情况下的虚函数表 (1)单继承无虚函数覆盖 (2)单继承有虚函数覆盖 (3)多继承无虚函数覆盖 (4)多继承有虚函数覆盖 三.对虚函数指针与虚函数表的深入理解 (1 ...

  4. 【虚函数指针 虚函数表】

    文章目录 虚函数指针和虚函数表 1.虚函数的含义 2.虚函数的作用 3.虚函数的实现原理 多态的实现原理 `普通类` `当类中存在虚函数` `子类继承父类不重写虚函数` 子类继承父类重写虚函数 1.虚 ...

  5. C++多态的原理(虚函数指针和虚函数表)

    C++多态的原理 (虚函数指针和虚函数表) 1.虚函数指针和虚函数表 2.继承中的虚函数表 2.1单继承中的虚函数表 2.2多继承中的虚函数表 3.多态的原理 4.总结 1.虚函数指针和虚函数表 以下 ...

  6. C++虚函数表、虚函数指针(侯捷)

    C++虚函数表.虚函数指针(侯捷)

  7. 初入c++(六)虚函数实现多态,虚析构函数,虚函数表和多态实现机制,纯虚函数。

    1.c++多态的概念以及用途. 1.1虚函数实现多态 通过基类指针只能够访问派生类的成员变量,不能够访问派生类的成员函数. 解决问题的办法:使用虚函数(virtual function),只需要在函数 ...

  8. C++ 虚函数详解(虚函数表、vfptr)——带虚函数表的内存分布图

    前言 总所周知,虚函数是实现多态的基础. 引用或指针的静态类型与对象本身的动态类型的不同,才是C++支持多态的根本所在. 当使用基类的引用或指针调用一个虚函数成员时,会执行动态绑定. 所有的虚函数都必 ...

  9. 虚函数,虚函数表,虚函数实现原理,虚函数实现机制,虚函数解决的问题

    虚函数 虚函数表 虚函数实现原理? 虚函数解决的问题?虚函数解决问题的实现机制? 虚函数模型的构建? 虚函数模型的应用?

最新文章

  1. yolov4源码_YOLOv4特征提取网络——CSPDarkNet结构解析及PyTorch实现
  2. O'Reilly 1500 份问卷调研:2019 年 Serverless 落地到底香不香?
  3. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
  4. 2020年十月下旬,再次更新了自己的linkedin工作经历
  5. Ignoring query to other database
  6. 首次公开!人教版1-9年级绝密编写:被重点中小学永久收录的数学教案和试题...
  7. Spring Security用户认证和权限控制(默认实现)
  8. datapump跨平台升级迁移的总结
  9. Springboot+Mysql物流快递在线寄查快递系统
  10. 安装成功后python报错_python安装mysql的依赖包mysql-python操作
  11. 【通信】基于matlab GUI短波通信系统仿真【含Matlab源码 647期】
  12. kafka 2.10 java api_kafka中常用API的简单JAVA代码
  13. vnc远程控制linux端口5901,VNC远程控制Linux
  14. matlab各向异性高斯核方向导数滤波器,基于各向异性高斯方向导数滤波器提取图像粗边缘的方法...
  15. 基于C#.NET对战卡牌游戏-《混战》游戏开发
  16. 华为:鸿蒙 Harmony OS 明年将正式登陆欧洲
  17. 详解阿里云数据中台,一篇文章全面了解大数据“网红”
  18. 西门子plc博图与优傲UR机器人进行Profinet通讯,s7-1200/1500 与UR机器人通讯,实际应用案例使用中
  19. 分享一款 Google Pixel 2 独家动态壁纸
  20. sourcetree提交报错 git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks ······

热门文章

  1. 如何查看光驱硬盘托架的尺寸_「二次利用」没想到废光驱电机还可以这样利用...
  2. 【Hive】条件函数
  3. 【PL/SQL】测试函数时,日期参数的输入格式
  4. 通过手动抛自定义异常实现spring事务回滚
  5. ArcGIS Server10.2服务启动不了之http://localhost:6080/arcgis/manager无法打开之arcMap 无法打开6080admin问题解决之路
  6. vue init失败解决方案-终极版
  7. Java自定义异常、全局捕获异常、拦截器 实现动态控制登录超时
  8. 异常 Failed to instantiate [java.util.List]: Specified class is an interface
  9. JavaScript将焦点设置为HTML表单元素
  10. 响应内容类型为CSV