IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 菱形继承和c++开发人员命令提示工具的使用 -> 正文阅读

[C++知识库]菱形继承和c++开发人员命令提示工具的使用

菱形继承的问题

菱形继承问题出现在多个子类继承父类的时候,将父类的数据一分为二,问题是在子类又出现了多继承的问题。被一分为二的属性又重新被赋值给了一个子类,本应该就是一份数据,这时确出现了两份,见如下案例

#include <iostream>
using namespace std;

//菱形继承问题
//羊和驼都继承了动物类,动物中的Age属性被一分为二
//羊驼是羊和驼的后代,子类多继承了父类,对于羊驼来说Age属性发生冲突

class Animal
{
public:
	int Age;
};
class Sheep : public Animal
{

};
class Tuo : public Animal
{

};
class SheepTuo : public Sheep, public Tuo
{
	
};
void text01(void)
{
	SheepTuo st;
	st.Sheep::Age = 18;
	st.Tuo::Age = 28;
	cout << "羊驼的年龄: " << st.Sheep::Age << endl;
	cout << "羊驼的年龄: " << st.Tuo::Age << endl;
}

int main(void)
{
	text01();
	return 0;
}

在这里插入图片描述

解决办法

就是不让Age属性一分为二,问题出现在羊和驼继承父类的时候,将Age一分为二。
我们使用虚继承的方式,就可以避免将父类的属性一分为二
上代码

#include <iostream>
using namespace std;

//菱形继承问题
//羊和驼都继承了动物类,动物中的Age属性被一分为二
//羊驼是羊和驼的后代,子类多继承了父类,对于羊驼来说Age属性发生冲突

class Animal
{
public:
	int Age;
};
class Sheep : virtual public Animal
{

};
class Tuo : virtual public Animal
{

};
class SheepTuo : public Sheep, public Tuo
{
	
};
void text01(void)
{
	SheepTuo st;
	st.Sheep::Age = 18;
	st.Tuo::Age = 28;
	cout << "羊驼的年龄: " << st.Sheep::Age << endl;
	cout << "羊驼的年龄: " << st.Tuo::Age << endl;
}

int main(void)
{
	text01();
	return 0;
}

在这里插入图片描述

c++开发人员命令提示工具

我们使用c++开发人员命令提示工具 跳转到当前的工程目录,可以用于查看c++的类内存布局

//第一个是字母L
//第二个是数字1
cl /d1 reportSingalClassLayoutSheepTuo main.cpp

首先分析一下第二种法情况

现在查看的是虚继承之后的情况
在这里插入图片描述

  • 可以看到在Sheep和Tuo继承下来的东西叫vbptr,这个东西是虚基类指针的缩写virtual base ptr,这个指针指向的是vbtable(虚基类表的缩写 virtual base table)。Sheep类的虚基类指针指向的是Sheep的虚基类表,有上图可以看,这个表里记录的是虚基类指针的偏移量。所以Sheep类在原来0的位置加8就找到了Age的地址,同理Tuo类的偏移量是4,在原来的基础上加4也找到了Age 的地址。现在可以看出来为什么Age这份数据不会被一分为二了

第一种情况

在菱形继承问题中如果没有采用虚继承,我们在查看一下内存情况
在这里插入图片描述
由此可见未使用虚继承时,Age属性被拷贝了两份,继承的不再是指针。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:22:34  更:2021-08-24 15:24:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 7:01:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计