#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;//动物类
class Animal
{
public:int m_Age; //年龄
};//virtual加上后 继承方式 数据虚继承
// Animal类 变为 虚基类
//羊类
class Sheep : virtual public Animal
{};//驼
class Tuo : virtual public Animal
{};//羊驼
class SheepTuo : public Sheep, public Tuo
{};void test01()
{SheepTuo st;st.Sheep::m_Age = 10;st.Tuo::m_Age = 20;cout << "age = " << st.Sheep::m_Age << endl;cout << "age = " << st.Tuo::m_Age << endl;cout << "age = " << st.m_Age << endl;//m_Age只需要一份即可,菱形继承导致数据有一份浪费}//虚继承内部工作原理
void test02()
{SheepTuo st;st.m_Age = 100;//通过sheep找到偏移量值cout << "通过sheep找到的偏移量为:" << *(int *)((int*)*(int *)&st + 1) << endl;//通过Tuo找到偏移量值cout << "通过Tuo找到的偏移量为:" << *(int *)((int*)*((int *)&st + 1) + 1) << endl;//通过偏移量 求出m_Age的值cout << "age =  " << ((Animal *)((char *)&st + (*(int *)((int*)*(int *)&st + 1))))->m_Age << endl;}int main(){//test01();test02();system("pause");return EXIT_SUCCESS;
}

ps: 这里注意指针 步长的概念, 不同的指针类型, 步长不一样, 增加或减少的幅度不一样, 切记!!!

C++ 菱形虚继承 通过指针来寻找继承过来的成员变量相关推荐

  1. java编写一个动物类_Java编程 实现类的继承与多态 写一个动物类。成员变量为动物的种类,成员方法是动物叫声。...

    感觉写得够详细了,如果不懂M我abstract class Animal { //动物的种类用变量n表示 String n; //动物的声音用变量s表示 String s; //在这里声明了一个抽象方 ...

  2. C++继承时的对象内存位置(一)有成员变量遮蔽时的内存分布

    #include <cstdio> #include<iostream> using namespace std; //基类A class A{public:A(int a, ...

  3. C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节

    1.问题 1).结构体大小 结构体成员的内存分配满足下面三个条件   2 结构体第一个成员的地址和结构体的首地址相同   3 结构体每个成员地址相对于结构体首地址的偏移量是该成员大小的整数倍,如果不是 ...

  4. c++ 虚函数多态、纯虚函数、虚函数表指针、虚基类表指针详解

    文章目录 静态多态.动态多态 虚函数 哪些函数类型不可以被定义成虚函数? 虚函数的访问方式 析构函数中的虚函数 虚函数表指针 vptr 多继承下的虚函数表 虚基类表指针 bptr 纯虚函数 抽象类 虚 ...

  5. 为什么要写this在访问成员变量的时候_C++幕后故事(一) --对象模型this指针调整...

    1.什么叫this指针调整? 在c++中多继承过程,根据访问不同的父类成员变量或者是成员函数,同一个实例对象会出现不同的基址(对象的地址,类似于你在不同的场合就会有身份的转换,在家的身份,在学校,在公 ...

  6. Java基础:成员变量的继承与覆盖

    1.前言 最近在研究Java多态时,发现子类通过继承父类来实现Java中的多态.子类可以继承父类的成员方法和成员变量.子类中如果有同名的成员方法,并且方法的参数和返回值一样,那么这个子类定义的这个方法 ...

  7. C++>继承,继承方式及其比较,子类和父类对象指针,派生类的默认成员函数,虚继承,继承与友元,继承与静态成员

    继承 继承的概念与定义 概念: 继承是指一个子类(或称为派生类)继承父类(或称为基类)的特征(属性和操作).继承是面向对象程序设计时实现代码复用的重要手段,它允许在原有的类的基础上进行扩展,增加功能, ...

  8. 【C++】继承和派生、虚继承和虚基类、虚基类表和虚基类指针

    继承和派生.虚继承和虚基类.虚基类表和虚基类指针 继承和派生 继承概述 继承基本概念 派生类中的成员 继承的内容 派生类定义 派生类访问控制 对象构造和析构 对象构造和析构的调用顺序 继承中的构造和析 ...

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

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

最新文章

  1. GoldenGate的Logdump工具使用简介
  2. python安装在哪个盘_python要安装在哪个盘
  3. .NET开发微信小程序-微信支付
  4. [分治] Jzoj P5807 简单的区间
  5. leetcode 42 python
  6. 重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源
  7. dns日志级别 linux,linux下DNS服务器视图view及日志系统详解
  8. [POI2009]Wie
  9. 贪吃蛇游戏C语言源代码学习
  10. 用c语言编写一个打勾的图形,C语言图形编程.ppt
  11. 锐浪报表开发Web版
  12. springboot获取国家法定节假日
  13. Java实现 蓝桥杯VIP 算法提高 盾神与砝码称重
  14. PHP操作MongoDB技術總結
  15. 通过python刷android步数,使用 Python 修改微信/QQ/支付宝运动步数
  16. 计算机安全面临的常见问题分析
  17. ACM 130. [USACO Mar08] 游荡的奶牛(dp+BFS)
  18. web学习 -- w3c dom标准
  19. php购物车完整类代码,PHP购物车类代码
  20. Python爬取游戏英雄皮肤图片 王者+LOL

热门文章

  1. JavaScript:Browser 对象
  2. Axis通过wsdd部署Web Service
  3. js技巧收集(200多个)
  4. Java排序算快速排序_Java排序算法 [快速排序]
  5. pdf打印机安装程序_CAD快速出打印PDF格式文件
  6. ceph存储原理_热门的分布式存储系统ceph入门介绍
  7. html 输入框从左上角,在输入框的左上角,使文本开始_input_开发99编程知识库
  8. 监控java_Java应用程序监控JavaMelody
  9. linux svn 看不到文件,SVN更新时不能打开新文件svn-base系统找不到指定的文件
  10. Java是先难后易吗_在解决问题的时候,是先难后易还是先易后难?