//内存单元地址分配、构造 的顺序与继承的顺序有关
#include <iostream>
#include <string>
using namespace std;class A
{
public:int m_a;~A(){cout << "~~A" << endl;}
};class A1 :virtual public A
{
public:int m_a1;A1(int a1){m_a1 = a1;cout << "A1" << endl;}~A1(){cout << "~~A1" << endl;}};class A2 :virtual public A
{
public:int m_a2;A2(int a2){m_a2 = a2;cout << "A2" << endl;}~A2(){cout << "~~A2" << endl;}
};class C :public A1,public A2
{
public:int m_c;C(int c) : A1(c), A2(c){m_c = c;cout << "CCCCCCCCC" << endl;}~C(){cout << "~~CCCCCCCCC" << endl;}
};int main()
{C c1(1);cout << sizeof(c1) << endl; cout << "&c1   =  " << &c1 << endl;cout << "&c1.A1::m_a " << &c1.A1::m_a << endl;cout << "&c1.m_a1 = " << &c1.m_a1 << endl;cout << "&c1.A2::m_a " << &c1.A2::m_a << endl;cout << "&c1.m_a2 = " << &c1.m_a2 << endl;cout << "&c1.m_c = " << &c1.m_c << endl;//虚继承就是把 父类里的变量的地址分配 往后放, 先分配自己的地址cout << "虚继承就是把 父类里的变量的地址分配 往后放, 先分配自己的地址" << endl;cout << "&c1.m_a1 = " << &c1.m_a1 << endl;cout << "&c1.m_a2 = " << &c1.m_a2 << endl;cout << "&c1.m_c = " << &c1.m_c << endl;cout << "&c1.A1::m_a " << &c1.A1::m_a << endl;cout << "&c1.A2::m_a " << &c1.A2::m_a << endl;//对应的虚继承在其最前面分配一个指针(占四个字节) 指向 虚继承来的变量地址(在最后面)system("pause");return 0;
}
#include <iostream>using namespace std;class A
{
private:int m_a;
public :A(){cout << "A constuctor" << endl;}void print(){cout << "AAAAAAAAA" << endl;}
};class B :public A
{
private:int m_b;
public:B(){cout << "B constuctor" << endl;}void print(){cout << "BBBBBBBB" << endl;}
};int main()
{A a1;B b1;a1 = b1;A *p1 = new A;//父类指针指向父类对象A *p2 = new B;//父类指针只爱想子类对象(向下转型)p2->print();B *p3 = new B;//子类指针指向子类对象system("pause");return 0;
}

7-28晚复习 虚继承与地址分配相关推荐

  1. C++基本概念复习之二:多重继承、虚继承、纯虚函数(抽象类)

    一.多重继承: #include <iostream> using namespace std; class Horse { public: Horse(){cout<<&qu ...

  2. 一个虚函数和虚继承的问题。

    这个问题困惑好几天了.废话不多说,先上代码. 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: ...

  3. 多重继承和虚继承的内存布局

    这篇文章主要讲解虚继承的C++对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别.虚函数表的格式等一些大部分C++程序员都似是而非的概念.原文见这里 (By Eds ...

  4. 多重继承、虚继承与虚基类

    一.多重继承 单重继承--一个派生类最多只能有一个基类 多重继承--一个派生类可以有多个基类 class 类名: 继承方式 基类1,继承方式 基类2,-. {-.}; 派生类同时继承多个基类的成员,更 ...

  5. C++中虚函数工作原理和(虚)继承类的内存占用大小计算

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理       虚函数的实现要求对象携带额 ...

  6. C++继承详解三 ----菱形继承、虚继承

    转载:http://blog.csdn.net/pg_dog/article/details/70175488 今天呢,我们来讲讲菱形继承与虚继承.这两者的讲解是分不开的,要想深入了解菱形继承,你是绕 ...

  7. C++对象模型:单继承,多继承,虚继承

    什么是对象模型 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各种支持的底层实现机制. 类中成员分类 数据成员分为静态和非静态,成员函数有静态非静态以及虚函数 cla ...

  8. C++中的各种“虚“-- 虚函数、纯虚函数、虚继承、虚基类、虚析构、纯虚析构、抽象类讲解

    C++中的各种"虚" 1. 菱形继承 1.1 虚继承 && 虚基类 1.2 虚基类指针(vbptr)&& 虚基类表(vbtable) 2. 多态 2 ...

  9. C++:钻石继承与虚继承

    QUESTION:什么是钻石继承? ANSWER:假设我们已经有了两个类Father1和Father2,他们都是类GrandFather的子类.现在又有一个新类Son,这个新类通过多继承机制对类Fat ...

最新文章

  1. 2018年人工智能全景图与发展趋势分析
  2. android--------WebView实现 Html5 视频标签加载
  3. 矩阵迹的性质_“拨开迷雾”,如何判定矩阵相似?
  4. 【解决方案】OpenCV配置【Win10+VS2017】(本人于2018年3月30日完成)
  5. SpringCloud2.0入门4-springboot-admin监控
  6. 洛谷 [SDOI2009]晨跑
  7. Mockito框架学习 - how does expected annotation work
  8. 数据库设计笔记——关系型数据库基础知识(三)
  9. 手动安装Linux网卡驱动程序
  10. mysql pdo手册_灾难恢复 - [ MySql参考手册 ] - 在线原生手册 - php中文网
  11. Linux之Shell管理脚本(一)
  12. 《深度学习工程师》听课笔记,编程作业和课后练习
  13. Swift-初始化失败处理方法
  14. android 维语 字体,维语字体手机版下载-维吾尔文字体apk下载 v2.0 安卓版-IT猫扑网...
  15. 实验室一块GPU都没有?这个云平台直接送3090、A100免费无门槛代金券!
  16. 软件设计与体系结构:设计过程
  17. VOT数据集下载——(vot2013到vot2019)
  18. 开源软件的安全性风险_认真对待开源安全性
  19. 2018年最新最全的全国省市区五级四级三级地址数据库的SQL下载
  20. BusyCal for Mac(任务日历工具)

热门文章

  1. wav文件头修复_标记管理音频文件工具:Yate for Mac
  2. opencv 人脸识别_Python学习:基于Opencv来快速实现人脸识别(完整版)
  3. 银河麒麟安装远程桌面
  4. Bat_To_Exe_Converter 乱码 中文
  5. oracle虚拟机 centos6.5,虚拟机oracle virtualbox 上安装centos6.5 网络设置
  6. python程序运行键_python学习笔记-python程序运行
  7. 国际计算机语言,国际标准的5种PLC编程语言简介
  8. matlab rltool,matlab工具箱
  9. java 多线程监听同一个端口_使用多线程在Java服务器中同时侦听两个端口
  10. xcode8 matlab,Xcode8 iOS App上传详细流程